80pts 求助
查看原帖
80pts 求助
1054181
longlinyu7楼主2024/8/29 21:30

rt

#include<bits/stdc++.h>
using namespace std;
// #define int long long 
const int MOD = 1e9;
const int N=5e5+10;

int t,n;
int h[N],cnt;
struct node{
    int to,val,nextt;
}mp[N];
void add(int a,int b,int c){
    mp[++cnt].to=b;
    mp[cnt].val=c;
    mp[cnt].nextt=h[a];
    h[a]=cnt;
}

int d[N],deg[N];
int f[N],ans;
void init(){
    memset(h,0,sizeof(h));
    memset(mp,0,sizeof(mp));
    memset(f,0,sizeof(f));
    memset(d,0,sizeof(d));
    memset(deg,0,sizeof(deg));
    cnt=ans=0;
}
void dfs(int u,int fa){
    d[u]=0;
    for(int i=h[u];i;i=mp[i].nextt){
        int v=mp[i].to,w=mp[i].val;
        if(v==fa)continue;
        dfs(v,u);
        if(deg[v]==1)d[u]+=w;
        else d[u]+=min(d[v],w);
        // ! min(d[v],w) 就是计算 u 到 v 这条边的贡献 
    }
}



void dp(int u,int fa){
    for(int i=h[u];i;i=mp[i].nextt){
        int v=mp[i].to,w=mp[i].val;
        if(v==fa)continue;
        if(deg[u]==1) f[v]=d[v]+w;
        else if(deg[v]==1)    f[v]=d[v]+min(f[u]-w,w);
      
        else f[v]=d[v]+min(f[u]-min(d[v],w),w);
        dfs(v,u);
    }
}
signed main(){
    cin>>t;
    while(t--){
        cin>>n;
        init();
        int u,v,w;
        for(int i=1;i<n;i++){
            cin>>u>>v>>w;
            add(u,v,w);
            add(v,u,w);
            deg[u]++;deg[v]++;
        }
        dfs(1,1);
        f[1]=d[1]; //! 这个根节点的需要转移一下
        dp(1,1);
        for(int i=1;i<=n;i++){
            ans=max(ans,f[i]);
        }
        cout<<ans<<"\n";
    }



    return 0;
}






2024/8/29 21:30
加载中...