POJ 3107

http://poj.org/problem?id=3107

跟poj 1655差不多 

但是那个一下过了 这个却。。。

因为 addedge(u,v);错写成了 addedge[u][v]...彻底无语 泪奔啊

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
const int MAX=50005;
using namespace std;

int visit[MAX],head[MAX],ans[MAX],num[MAX];
int n,k,sizemin,sum;
struct{int v,next;}e[MAX*2];

void addedge(int u,int v)
{
k++;
e[k].v=v;
e[k].next=head[u];
head[u]=k;
}

void dfs(int u)
{
int i,min;
visit[u]=1;
num[u]=1;
min=-1;
for(i=head[u];i;i=e[i].next)
{
int t=e[i].v;//i是边 t是点
if(!visit[t])
{
dfs(t);
num[u]+=num[t];
min=max(min,num[t]);
}
}
min=max(min,n-num[u]);
if(min<sizemin)
{
ans[0]=u;
sum=1;

sizemin=min;
}
else if(min==sizemin)
{
ans[sum]=u;
sum++;
}

}

int main()
{
int i,u,v;
scanf("%d",&n);

memset(head,0,sizeof(head));
k=0;
for(i=1;i<n;i++)
{ scanf("%d%d",&u,&v);

addedge(u,v);
addedge(v,u);
}
memset(visit,0,sizeof(visit));
memset(num,0,sizeof(num));
sizemin=MAX+10;
dfs(1);
sort(ans,ans+sum);
for(i=0;i<sum;i++)
printf("%d ",ans[i]);
return 0;

}



posted @ 2011-11-27 01:05  快乐.  阅读(210)  评论(0编辑  收藏  举报