POJ 3107 Godfather 求重心
2017-10-26 19:26
381 查看
题目链接
http://poj.org/problem?id=3107#
题意
黑帮们之间的联系网是树状的,且将网络中的教父去除后,与去掉其他点相比,其最大子树是最小的。求出所有这些结点。思路
求重心的模板题。。#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<string> #include<queue> #include<stack> #include<set> #include<map> #define ll long long using namespace std; const int INF = ( 2e9 ) + 2; const ll maxn = 5e4+100; struct edge { int v,next; }e[maxn*2]; int head[maxn]; int tot; int son[maxn],Max[maxn],ans[maxn]; int Maxsubtree,n; void add(int u,int v) { e[tot].v=v; e[tot].next=head[u]; head[u]=tot++; } void dfs(int u,int fa) { son[u]=1; for(int i=head[u];i!=-1;i=e[i].next) { int v=e[i].v; if(v==fa)continue; dfs(v,u); son[u]+=son[v]; Max[u]=max(Max[u],son[v]); } Max[u]=max(Max[u],n-son[u]); if(Maxsubtree>Max[u]) Maxsubtree=Max[u]; } int main() { while(~scanf("%d",&n)) { memset(head,-1,sizeof(head)); tot=0; int u,v; for(int i=1;i<=n-1;i++) { scanf("%d%d",&u,&v); add(u,v); add(v,u); } Maxsubtree=INF; for(int i=1;i<=n;i++)Max[i]=-INF; dfs(1,-1); int cnt=0; for(int i=1;i<=n;i++) if(Max[i]==Maxsubtree) ans[cnt++]=i; for(int i=0;i<cnt;i++) if(i!=cnt-1) printf("%d ",ans[i]); else printf("%d\n",ans[i]); } }
相关文章推荐
- 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 求树的重心
- poj 3107 Godfather 求树的所有重心 树形DP
- POJ 3107 Godfather (树的重心)
- POJ 3107 Godfather (求树的重心)
- 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 1655 and 3107 and 2378 树形dp(树的重心问题)
- 树的重心 poj - 1655 和 poj - 3107