#include <climits> #include <iostream> #include <vector> using namespace std; // 以 root 为终点的最长路径 int dfs(int root, vector<int>& nums, vector<vector<int>>& children, int& res) { // 最长路,次长路 int len1 = 0, len2 = 0; for (int child : children[root]) { int x = dfs(child, nums, children, res); if (x > len1) { len2 = len1; len1 = x; } else if (x > len2) { len2 = x; } } res = max(res, nums[root] + max(len1, 0) + max(len2, 0)); return len1 + nums[root]; } int main() { int n; cin >> n; vector<int> nums(n); for (int i = 0; i < n; i++) { cin >> nums[i]; } vector<vector<int>> children(n); for (int i = 0; i < n; i++) { int x; cin >> x; if (x > 0) { children[x - 1].push_back(i); } } int res = INT_MIN; dfs(0, nums, children, res); cout << res << endl; return 0; } // 64 位输出请用 printf("%lld")