作者:
navystar
,
2023-05-26 20:34:48
,
所有人可见
,
阅读 4
//这里填你的代码^^
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N = 1e4 + 10;
int h[N], e[N], ne[N], w[N], idx;
bool father[N];
int f[N][2];
inline void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}
inline void dfs(int u)
{
f[u][1] = w[u];
for (int i = h[u]; ~i; i = ne[i])
{
int j = e[i];
dfs(j);
int cnt = f[j][0] > f[j][1] ? f[j][0] : f[j][1];
f[u][0] += cnt;
f[u][1] += f[j][0];
}
}
inline void solve()
{
int n;
cin >> n;
memset(h, -1, sizeof h);
for (int i = 1; i <= n; i ++ ) cin >> w[i];
for (int i = 1; i < n; i ++ )
{
int l, k;
cin >> l >> k;
father[l] = true;
add(k, l);
}
int root = 1;
while (father[root]) root ++;
dfs(root);
int cnt = f[root][0] > f[root][1] ? f[root][0] : f[root][1];
cout << cnt << endl;
}
int main()
{
cin.tie(nullptr) -> sync_with_stdio(0);
solve();
return 0;
}
作者:navystar
链接:https://www.acwing.com/solution/content/189943/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~