码迷,mamicode.com
首页 > 其他好文 > 详细

poj3585 Accumulation Degree(换根dp)

时间:2020-04-05 22:27:19      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:tin   col   span   head   const   img   lse   for   ref   

传送门

换根dp板子题(板子型选手

题意:

  一棵树确定源点和汇点找到最大的流量(拿出一整套最大瘤板子orz

 

技术图片
const int maxn=2e5+10;
int head[maxn],tot;
struct node
{
    int nt,to;long long w;
}q[2*maxn];
long long dp[maxn];int cnt[maxn];
void insert(int u,int v,long long w)
{
    q[tot].nt=head[u];q[tot].w=w;q[tot].to=v;head[u]=tot++;
    q[tot].nt=head[v];q[tot].w=w;q[tot].to=u;head[v]=tot++;
}
long long ans;
void dfs(int u,int fa)
{
    //cout<<u<<endl;
    for(int i=head[u];i!=-1;i=q[i].nt){
        int v=q[i].to;long long w=q[i].w;
        if(v==fa)    continue;
        dfs(v,u);
        if(cnt[v]==1)
            dp[u]+=w;
        else
            dp[u]+=min(w,dp[v]);
        //cout<<u<<" "<<dp[u]<<endl;
    }
}
void dfs1(int u,int fa)
{
    //cout<<u<<" "<<dp[u]<<endl;
    ans=max(ans,dp[u]);
    for(int i=head[u];i!=-1;i=q[i].nt){
        int v=q[i].to;long long w=q[i].w;
        if(v==fa)    continue;
        dp[v]+=min(w,dp[u]-min(dp[v],w));
        dfs1(v,u);
    }
}
int main()
{
    int t;scanf("%d",&t);
    while(t--){
        int n;scanf("%d",&n);ans=0;
        for(int i=1;i<=n;i++)    head[i]=-1,cnt[i]=0,dp[i]=0;tot=0;
        for(int i=1;i<n;i++){
            int t1,t2;long long t3;scanf("%d%d%lld",&t1,&t2,&t3);
            insert(t1,t2,t3);cnt[t1]++;cnt[t2]++;
        }
        dfs(1,0);
        dfs1(1,0);
        cout<<ans<<endl;
    }
}
View Code

 

poj3585 Accumulation Degree(换根dp)

标签:tin   col   span   head   const   img   lse   for   ref   

原文地址:https://www.cnblogs.com/r138155/p/12639253.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!