换根dp 注意多组数据
对于第一次dfs,每一个点的水流等于容量和流量的最小值。
对于第二次dfs,消除贡献即可。
#include <bits/stdc++.h> using namespace std; const int N=200005; #define ll long long const int INF=1e9+10; struct node { int v,next; int w; }e[N<<1]; int head[N]; int cnt=0,n; int dp[N],ans[N]; void init() { cnt=0; memset(head,0,sizeof(head)); memset(dp,0,sizeof(dp)); memset(ans,0,sizeof(ans)); } void add(int u,int v,int w) { e[++cnt].v=v; e[cnt].w=w; e[cnt].next=head[u]; head[u]=cnt; } void dfs(int u,int pre) { bool haveson=false; for(int i=head[u];i;i=e[i].next) { int to=e[i].v; if(to==pre) continue; if(!haveson) haveson=true; dfs(to,u); dp[u]+=min(dp[to],e[i].w); //if(u==4) cout<<to<<":"<<dp[u]<<endl; } if(!haveson) dp[u]=INF; } void dfs2(int u,int pre) { for(int i=head[u];i;i=e[i].next) { int to=e[i].v; if(to==pre) continue; if(dp[to]>=INF) dp[to]=0; ans[to]=dp[to]+min(e[i].w,(ans[u]-min(dp[to],e[i].w))); //cout<<to<<":"<<ans[to]<<","<<dp[to]<<endl; dfs2(to,u); } } int main() { int t; scanf("%d",&t); while(t--) { init(); scanf("%d",&n); for(int i=1;i<n;i++) { int u,v; int w; scanf("%d%d%d",&u,&v,&w); add(u,v,w); add(v,u,w); } dfs(1,1); ans[1]=dp[1]; dfs2(1,1); int res=dp[1]; for(int i=2;i<=n;i++) res=max(res,ans[i]); printf("%d\n",res); } }