首页 > 代码库 > 树形dp求树的重心

树形dp求树的重心

Balancing Act http://poj.org/problem?id=1655

 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<vector> 5 #define mt(a,b) memset(a,b,sizeof(a)) 6 using namespace std; 7 const int M=50010; 8 vector<int> g[M]; 9 int dp[M],num[M],n;10 void dfs(int u,int fa){11     dp[u]=0;12     num[u]=1;13     int len=g[u].size();14     for(int i=0;i<len;i++){15         int v=g[u][i];16         if(v!=fa){17             dfs(v,u);18             num[u]+=num[v];19             dp[u]=max(dp[u],num[v]);20         }21     }22     dp[u]=max(dp[u],n-num[u]);23 }24 int main(){25     int t;26     while(~scanf("%d",&t)){27         while(t--){28             scanf("%d",&n);29             for(int i=1;i<=n;i++) g[i].clear();30             for(int i=0,u,v;i<n-1;i++){31                 scanf("%d%d",&u,&v);32                 g[u].push_back(v);33                 g[v].push_back(u);34             }35             dfs(1,-1);36             int sma=n;37             for(int i=1;i<=n;i++){38                 sma=min(sma,dp[i]);39             }40             for(int i=1;i<=n;i++){41                 if(dp[i]==sma){42                     printf("%d %d\n",i,dp[i]);43                     break;44                 }45             }46         }47     }48     return 0;49 }
View Code
 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<vector> 5 #define mt(a,b) memset(a,b,sizeof(a)) 6 using namespace std; 7 const int M=50010; 8 struct G{ 9     struct E{10         int u,v,next;11     }e[M<<1];12     int le,head[M];13     void init(){14         le=0;15         mt(head,-1);16     }17     void add(int u,int v){18         e[le].u=u;19         e[le].v=v;20         e[le].next=head[u];21         head[u]=le++;22     }23 }g;24 int dp[M],num[M],n;25 void dfs(int u,int fa){26     dp[u]=0;27     num[u]=1;28     for(int i=g.head[u];~i;i=g.e[i].next){29         int v=g.e[i].v;30         if(v!=fa){31             dfs(v,u);32             num[u]+=num[v];33             dp[u]=max(dp[u],num[v]);34         }35     }36     dp[u]=max(dp[u],n-num[u]);37 }38 int main(){39     int t;40     while(~scanf("%d",&t)){41         while(t--){42             scanf("%d",&n);43             g.init();44             for(int i=0,u,v;i<n-1;i++){45                 scanf("%d%d",&u,&v);46                 g.add(u,v);47                 g.add(v,u);48             }49             dfs(1,-1);50             int sma=n;51             for(int i=1;i<=n;i++){52                 sma=min(sma,dp[i]);53             }54             for(int i=1;i<=n;i++){55                 if(dp[i]==sma){56                     printf("%d %d\n",i,dp[i]);57                     break;58                 }59             }60         }61     }62     return 0;63 }
View Code

Godfather http://poj.org/problem?id=3107

 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define mt(a,b) memset(a,b,sizeof(a)) 5 using namespace std; 6 const int M=50010; 7 struct G{ 8     struct E{ 9         int u,v,next;10     }e[M<<1];11     int le,head[M];12     void init(){13         le=0;14         mt(head,-1);15     }16     void add(int u,int v){17         e[le].u=u;18         e[le].v=v;19         e[le].next=head[u];20         head[u]=le++;21     }22 }g;23 int dp[M],num[M],n;24 void dfs(int u,int fa){25     dp[u]=0;26     num[u]=1;27     for(int i=g.head[u];~i;i=g.e[i].next){28         int v=g.e[i].v;29         if(v!=fa){30             dfs(v,u);31             num[u]+=num[v];32             dp[u]=max(dp[u],num[v]);33         }34     }35     dp[u]=max(dp[u],n-num[u]);36 }37 int main(){38     while(~scanf("%d",&n)){39         g.init();40         for(int i=0,u,v;i<n-1;i++){41             scanf("%d%d",&u,&v);42             g.add(u,v);43             g.add(v,u);44         }45         dfs(1,-1);46         int sma=n;47         for(int i=1;i<=n;i++){48             sma=min(sma,dp[i]);49         }50         for(int i=1;i<=n;i++){51             if(dp[i]==sma){52                 printf("%d ",i);53             }54         }55         puts("");56     }57     return 0;58 }
View Code

 

 

 

 

end