您的位置:首页 > 编程语言 > Go语言

POJ 3107 Godfather (树的重心)

2015-09-25 09:55 736 查看
题意:求树的重心,若有多个,全部打印出来。

思路:

  树的重心:在删除点v后,森林中的每棵树的节点数尽量均匀,若最大的那棵树的节点数最小,称v为树的重心。

  这道题只是求树的所有重心,当且经当这棵树有对称性质时才有多重心,因此一棵树的重心最多不会超过2个。也是一遍DFS就可以搞定了,参考这个。

//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <deque>
#include <algorithm>
#include <vector>
#include <iostream>
#define pii pair<int,int>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define INF 0x7f7f7f7f
#define LL  long long
using namespace std;
const double PI  = acos(-1.0);
const int N=51000;
int n, cnt, edge_cnt, head
;

struct node
{
int from, to, next;
node(){};
node(int from,int to,int next):from(from),to(to),next(next){};
}edge[N*2];

void add_node(int from,int to)
{
edge[edge_cnt]=node(from,to,head[from]);
head[from]=edge_cnt++;
}
deque<int> que;

int DFS(int t,int far)
{
node e;
int big=0, sum=0;
for(int i=head[t]; i!=-1; i=e.next)
{
e=edge[i];
if(e.to==far)   continue;

int tmp=DFS(e.to, t);
big=max(big, tmp);
sum+=tmp;
}
big=max(big, n-sum-1);

if(big<=cnt)
{
if(big<cnt) que.clear();
cnt=big;
que.push_back(t);
}
return sum+1;
}

int main()
{
//freopen("input.txt", "r", stdin);
int a, b;
while(~scanf("%d",&n))
{
edge_cnt=0;
cnt=INF;
memset(head,-1,sizeof(head));

for(int i=1; i<n; i++)
{
scanf("%d%d",&a,&b);
add_node(a,b);
add_node(b,a);
}
DFS(1,-1);
sort(que.begin(),que.end());
while(!que.empty())
{
printf("%d ",que.front());
que.pop_front();
}
puts("");
}
return 0;
}


AC代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: