- Tree with Maximum Cost
- 题意:无向图一棵树,有N个点。每个点有一个权值,相邻两点距离为1,求一个最大节点值。
- 定义为emmmmm据说是换根Dp
-
#include<bits/stdc++.h> using namespace std; #define maxn 234567 #define ll long long ll n,a[maxn],deep[maxn],ans[maxn]; ll w[maxn],x,y,maxx,sum[maxn]; vector<int>edge[maxn]; void dfs(int cur,int pre) { deep[cur]=deep[pre]+1; maxx+=deep[cur]*w[cur]; for(int i=0; i<edge[cur].size(); i++) { int v=edge[cur][i]; if(v==pre)continue; dfs(v,cur); sum[cur]+=sum[v]; } sum[cur]+=w[cur]; } void dp(int cur,int pre) { for(int i=0; i<edge[cur].size(); i++) { int v=edge[cur][i]; if(v==pre)continue; ans[v]=ans[cur]+sum[1]-2*sum[v]; dp(v,cur); } } int main() { scanf("%lld",&n); for(int i=1; i<=n; i++) scanf("%lld",&w[i]); for(int i=1; i<n; i++) { scanf("%lld%lld",&x,&y); edge[x].push_back(y); edge[y].push_back(x); } deep[0]=-1; dfs(1,0); ans[1]=maxx; dp(1,0); for(int i=1; i<=n; i++) maxx=max(maxx,ans[i]); printf("%lld\n",maxx); return 0; }
F - Tree with Maximum Cost-裸换根DP
最新推荐文章于 2023-02-25 22:41:55 发布