poj 3107 Godfather(树的重心问题)
2016-10-04 18:45
381 查看
题意:在一棵有向树上求树的重心。
思路:
首先树的重心的定义:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡.
之前做过一道cf div2 C 得到一个结论,某个点的所有子树大小都小于等于这个棵树总数一般,那么这个点就是树重心。
所以和poj1655 类似 ,确立树根后(此题默认0为根)一遍dfs,求出那个点去掉后的子树结点最少,如果有多个,按照升序输出。
这题注意数据很大,用vector 实现邻接表会TLE。
还是窝谜之W了三发后才发现….找了一数组实现的模板。很好用。
思路:
首先树的重心的定义:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡.
之前做过一道cf div2 C 得到一个结论,某个点的所有子树大小都小于等于这个棵树总数一般,那么这个点就是树重心。
所以和poj1655 类似 ,确立树根后(此题默认0为根)一遍dfs,求出那个点去掉后的子树结点最少,如果有多个,按照升序输出。
这题注意数据很大,用vector 实现邻接表会TLE。
还是窝谜之W了三发后才发现….找了一数组实现的模板。很好用。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; template<int N,int M>//N点的个数,M边的个数 struct Graph { int top; struct Vertex{ int head; }V ; struct Edge{ int v,next; }E[M]; void init(){ memset(V,-1,sizeof(V)); top = 0; } void add_edge(int u,int v){ E[top].v = v; E[top].next = V[u].head; V[u].head = top++; } }; int n,ans[50000+10],sum[50000+10]; Graph<50000+10,50000*2+10> g; void dfs(int cur,int father){ sum[cur]=1; for(int i=g.V[cur].head;i!=-1;i=g.E[i].next){ int son=g.E[i].v; if(son==father) continue; dfs(son,cur); sum[cur]+=sum[son]; ans[cur]=max(ans[cur],sum[son]); } ans[cur]=max(ans[cur],n-sum[cur]); } int main(){ while(~scanf("%d",&n)){ g.init(); for(int i=1;i<n;i++){ int a,b;scanf("%d %d",&a,&b); g.add_edge(a,b); g.add_edge(b,a); ans[i]=0; sum[i]=0; } ans =0;sum =0; dfs(1,-1); int ok=0; for(int i=1;i<=n;i++){ if(ans[i]<=n/2){ if(!ok) ok=1; else printf(" "); printf("%d",i); } } printf("\n"); } }
相关文章推荐
- poj 3107 Godfather 求树的重心
- POJ-3107 Godfather & POJ-2378 Tree Cutting(树的重心)
- POJ 题目3107 Godfather(树的重心)
- 【求树的重心】POJ - 3107 Godfather
- POJ 3107 Godfather (树的重心模板题)
- POJ 3107 Godfather 求重心
- POJ 3107 Godfather (树的重心)
- poj 1655 and 3107 and 2378 树形dp(树的重心问题)
- poj 3107 Godfather 求树的所有重心 树形DP
- POJ 1655 Balancing Act&&POJ 3107 Godfather(树的重心)
- poj 3107 Godfather(树形dp,树的重心)
- poj 3107 Godfather(树的重心)
- Poj 3107 Godfather (树的重心)
- POJ 3107 Godfather (树重心)
- POJ - 3107 Godfather【树形dp+树的重心】
- poj 3107 Godfather(树的重心)
- POJ 3107 Godfather (树的重心)
- POJ 3107 Godfather (求树的重心)
- POJ 3107 Godfather(树的重心)
- poj 3107 树重心