POJ 3107 求树的重心
2016-11-28 21:49
176 查看
题意:求出树的所有重心编号,从小到大排序输出
#include<cstring> #include<string> #include<cstdio> #include<cstdlib> #include<iostream> #include<cmath> #include<algorithm> #include<queue> #include<vector> #include<map> #include<list> #include<stack> #include<climits> #include<cctype> #include<bitset> #include<set> #include<sstream> #include<climits> using namespace std; #define mod 1000000007 #define PI acos(-1.0) #define INF 0x3f3f3f3f typedef long long LL; typedef unsigned long long ULL; const int maxn=50005; struct edge{ int to,next; }E[maxn<<1]; int n,tol,num; int son[maxn]; int head[maxn]; bool vis[maxn]; int ans[maxn]; int siz; void init(){ siz=INF; tol=0; memset(vis,0,sizeof(vis)); memset(head,-1,sizeof(head)); memset(son,0,sizeof(son)); } void add(int u,int v){ E[tol].to=v; E[tol].next=head[u]; head[u]=tol++; } void dfs(int u){ vis[u]=1; son[u]=0; int tmp=0; for(int i=head[u];i!=-1;i=E[i].next){ int to=E[i].to; if(!vis[to]){ dfs(to); son[u]+=son[to]+1; tmp=max(tmp,son[to]+1); } } tmp=max(tmp,n-son[u]-1); if(tmp<siz){ num=0; siz=tmp; ans[num++]=u; } else if(tmp==siz){ ans[num++]=u; } } int main() { while(~scanf("%d",&n)){ init(); for(int i=1;i<=n-1;i++){ int u,v; scanf("%d%d",&u,&v); add(u,v); add(v,u); } dfs(1); sort(ans,ans+num); printf("%d",ans[0]); for(int i=1;i<num;i++){ printf(" %d",ans[i]); } printf("\n"); } return 0; }
相关文章推荐
- poj 3107 Godfather 求树的重心
- POJ 1655 +POJ 3107【求树的重心】
- POJ - 3107 Godfather【树形dp+树的重心】
- POJ 3107 Godfather (树的重心)
- POJ 3107 Godfather(树的重心)
- 【poj 1655,3107】树的重心(树形dp)
- POJ 3107 Godfather (树的重心)
- POJ 3107 Godfather (树重心)
- 树的重心求法POJ3107
- POJ 3107 Godfather (求树的重心)
- poj 3107 Godfather 求树的所有重心 树形DP
- Poj 3107 树的重心,前向星
- POJ 3107树的重心
- 求树的重心 POJ 1655、POJ 3107 树形DP
- poj 3107 Godfather(树形dp,树的重心)
- POJ 题目3107 Godfather(树的重心)
- POJ 1655 Balancing Act&&POJ 3107 Godfather(树的重心)
- POJ 3107 Godfather (树的重心模板题)
- poj 3107 Godfather(树的重心问题)
- poj 3107 树重心