• poj3585 树形dp 二次扫描,换根法模板题


    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<vector>
    using namespace std;
    #define maxn 200005
    
    struct Edge{
        int to,next,c;
    }edge[maxn<<1];
    int dp[maxn],f[maxn],vis[maxn],degree[maxn],head[maxn],tot;
    void addedge(int u,int v,int c){
        edge[tot].to=v;
        edge[tot].c=c;
        edge[tot].next=head[u];
        head[u]=tot;
        tot++;
    }
    
    void DP(int u){
        vis[u]=1;dp[u]=0;
        for(int i=head[u];i!=-1;i=edge[i].next){
            int v=edge[i].to;
            if(vis[v]) continue;
            DP(v);
            if(degree[v]==1) dp[u]+=edge[i].c;//分两种情况,叶子节点和非叶子结点 
            else dp[u]+=min(edge[i].c,dp[v]);
        }
    }
    void dfs(int u){
        vis[u]=1;
        for(int i=head[u];i!=-1;i=edge[i].next){
            int v=edge[i].to;
            if(vis[v]) continue;
            if(degree[u]==1)//分两种情况 
                f[v]=dp[v]+edge[i].c;//u只有v一个子节点 
            else 
                f[v]=dp[v]+min(edge[i].c,f[u]-min(dp[v],edge[i].c));//除了v外的其他节点 
            dfs(v);
        }    
    } 
    int main(){
        int t,u,v,c,n;
        scanf("%d",&t);
        while(t--){
            memset(head,-1,sizeof head);
            memset(degree,0,sizeof degree);
            tot=0;
            scanf("%d",&n);
            for(int i=1;i<n;i++){
                scanf("%d%d%d",&u,&v,&c);
                addedge(u,v,c);
                addedge(v,u,c);
                degree[u]++,degree[v]++;
            }
            
            int root=1,ans=0;
            memset(vis,0,sizeof vis);
            DP(root);
            f[root]=dp[root];
            memset(vis,0,sizeof vis);
            dfs(root);
            for(int i=1;i<=n;i++)
                ans=max(ans,f[i]);
            printf("%d
    ",ans);
        }
    } 
  • 相关阅读:
    Linux 任务计划
    Linux 进程及作业管理
    算法-动规
    算法-递归
    继承自string 的MyString
    魔兽2-装备
    [小甲鱼]入门学习python笔记 【魔法方法】
    [小甲鱼]入门学习python笔记 【类与对象】
    魔兽1 -备战
    讨厌的大整数加法
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10224252.html
Copyright © 2020-2023  润新知