Poj 3107 Godfather (树的重心)
2014-08-01 18:10
375 查看
题意:给定一棵树,求树的所有重心,按照编号从小到大的顺序输出.
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) const int N=50005; struct Edge { int from,to,next; }edge[N<<1]; int head ,e,dp ; //所有子树中节点数的最大值,不含自身 int n,son ; //以每个节点为根的子树的节点数,包含自身 int ans ; void Add (int u,int v) { Edge E = {u, v, head[u]}; edge[e] = E; head[u] = e++; } void DFS (int u, int pre) { son[u]=1; dp[u]=0; for (int i=head[u]; ~i; i=edge[i].next) { int v=edge[i].to; if (v==pre) continue; DFS(v,u); son[u]+=son[v]; dp[u]=max(dp[u],son[v]); } dp[u]=max(dp[u],n-son[u]); } int main () { while (~scanf("%d",&n)) { memset(head,-1,sizeof(head)); e=0; int i; for (i=1;i<n;i++) { int u,v; scanf("%d%d",&u,&v); Add(u,v); Add(v,u); } DFS(1,-1); int minnum=N,cnt=0; for (i=1;i<=n;i++) if (minnum > dp[i]) { cnt=0; minnum=dp[i]; ans[cnt++]=i; } else if (minnum==dp[i]) ans[cnt++]=i; for (i=0;i<cnt;i++) printf(i==cnt-1?"%d\n":"%d ",ans[i]); } return 0; }
相关文章推荐
- POJ 3107 Godfather 求重心
- poj 3107 Godfather 求树的重心
- POJ 3107 Godfather (树的重心)
- POJ 3107 Godfather (树的重心)
- poj 3107 Godfather(树的重心)
- POJ-3107 Godfather & POJ-2378 Tree Cutting(树的重心)
- poj 3107 Godfather 求树的所有重心 树形DP
- POJ 3107 Godfather (树重心)
- poj 3107 Godfather(树形dp,树的重心)
- POJ 3107 Godfather (求树的重心)
- poj 3107 Godfather(树的重心)
- POJ - 3107 Godfather【树形dp+树的重心】
- POJ 题目3107 Godfather(树的重心)
- POJ 1655 Balancing Act&&POJ 3107 Godfather(树的重心)
- poj 3107 Godfather(树的重心问题)
- POJ 3107 Godfather(树的重心)
- POJ 3107 Godfather (树的重心模板题)
- 【求树的重心】POJ - 3107 Godfather
- POJ 3107 - Godfather
- POJ 3107 求树的重心