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

POJ 3107 Godfather(DFS)

2011-02-24 22:24 399 查看
//DFS水题,在树中找到满足下条件的点集,若删除当前点集的点,则将树划分成的最大连通块最小,DFS统计即可
//统计方式只需要记录以当前结点为根的子树的结点数num,若要求父亲那一坨连通块只需要用N个点减去他所有儿子的num值即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int MAX = 50005;
const int INF = 200000000;
int V[2*MAX],next[2*MAX],head[MAX],edge;
void addEdge(int u,int v)
{
V[edge] = v;
next[edge] = head[u];
head[u] = edge++;
}
int N,num[MAX],ans[MAX],_min;
bool vis[MAX];
void getNum(int x)
{
for(int e = head[x];e != -1;e = next[e])
{
if(vis[V[e]])	continue;
vis[V[e]] = 1;
getNum(V[e]);
if(num[V[e]] > ans[x])	ans[x] = num[V[e]];
num[x] += num[V[e]];
}
num[x]++;
if(N - num[x] > ans[x])	ans[x] = N - num[x];
if(ans[x] < _min)	_min = ans[x];
}
void solve()
{
bool first = 1;
_min = INF;
vis[1] = 1;
getNum(1);
for(int i = 1;i <= N;++i)
{
if(ans[i] == _min)
{
if(first)
{
printf("%d",i);
first = 0;
}
else	printf(" %d",i);
}
}
printf("/n");
}
int main()
{
//freopen("in.txt","r",stdin);
int u,v;
scanf("%d",&N);
memset(head,-1,sizeof(head));
for(int i = 1;i < N;++i)
{
scanf("%d%d",&u,&v);
addEdge(u,v);
addEdge(v,u);
}
solve();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: