poj3585(樹形dp,換根法)


換根法思想為,

1,隨便找一個點作為根進行dp,

2,再以原來點為根進行dp,此次dp,設最優解為 f[x],那么f[root]=d[root],這是顯而易見的

然后再通過找d[son]與f[x]之間關系進行dp

比如本道題,若f[x]已知最優解,那么把son換成根,f[x]的最優解即為  d[v]+f[x]-min(d[v],w(x,v))

類似點分治求重心,通過與父親值做減法,求出樹上除v子樹外最優值

&&&&&此種類型適用於,給出一棵樹,要以每個點為根做一次dp的題目

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

struct my{
       int v;
       int next;
       int w;
};

const int maxn=500000+10;

int adj[maxn],fa,dp[maxn],root,du[maxn],f[maxn],ans;
my bian[maxn*2];
bool vis[maxn];

void myinsert(int u,int v,int w){
     bian[++fa].v=v;
     bian[fa].next=adj[u];
     adj[u]=fa;
     bian[fa].w=w;
}

void dfs1(int x){
     vis[x]=true;
     //dp[x]=0;
     for (int i=adj[x];i;i=bian[i].next){
        int v=bian[i].v;
        if(!vis[v]){
            dfs1(v);
            if(du[v]!=1) dp[x]+=min(bian[i].w,dp[v]);
            else dp[x]+=bian[i].w;
        }
     }
}

void dfs2(int x){
     vis[x]=true;
     for (int i=adj[x];i;i=bian[i].next){
        int v=bian[i].v;
        if(!vis[v]){
            if(du[x]!=1) f[v]=dp[v]+min(f[x]-min(dp[v],bian[i].w),bian[i].w);
            else {
                    f[v]=dp[v]+bian[i].w;
                   // printf("%d ",x);
            }//此時x為根
            ans=max(f[v],ans);
            dfs2(v);
        }
     }
}

int main(){
    int t,u,v,w,n;
    scanf("%d",&t);
    while(t--){
        fa=0;
        ans=0;
        memset(vis,0,sizeof(vis));
        memset(bian,0,sizeof(bian));
        memset(dp,0,sizeof(dp));
        memset(du,0,sizeof(du));
        memset(adj,0,sizeof(adj));
        memset(f,0,sizeof(f));
        scanf("%d",&n);
        for (int i=1;i<n;i++){
            scanf("%d%d%d",&u,&v,&w);
            du[u]++;
            du[v]++;
            myinsert(u,v,w);
            myinsert(v,u,w);
        }
        root=1;
        dfs1(root);
        memset(vis,0,sizeof(vis));
        f[root]=dp[root];
        dfs2(root);
        printf("%d\n",ans);
    }
return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM