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;
}