思路不太一样,我这里使用父节点是否去参加来做的,但是只有六十分,好像是几个比较大的数据不对?#2 #8 #9 #10
#include <bits/stdc++.h>
#define MAX_N 60005
using namespace std;
vector<int>nxt[MAX_N];
int r[MAX_N],n,root; //root旨在尋找誰是boss
int k,l;
int dp[MAX_N][2];
int work(int father,int w){ //w表示上司有沒有參加
if (dp[father][w]) return dp[father][w];
int ans0 = 0,ans1 = r[father];
for (auto& i : nxt[father]) {
ans0 += work(i,0); //not gonna join!
if (!w) ans1 += work(i,1); // I join!
}
return dp[father][w] = (w ? ans0 : max(ans0,ans1));
}
int main(){
cin >> n;
for (int i = 1;i <= n;i++) cin >> r[i];
for (int i = 1;i < n;i++) {
cin >> l >> k;
nxt[k].push_back(l); //l是k下屬
if (!root || root == l) root = k;
}
cout << work(root,0) << endl;
//for (int i = 1;i <= n;i++) cout << "下標 " << i << " 上司沒參加" << dp[i][0] << " 上司參加了" << dp[i][1] << endl;
return 0;
}