换根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);
    }
}