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

POJ 3107 Godfather

2013-10-11 09:50 369 查看
给一棵树,去掉一个节点后,剩下块中最大值最小时,此节点为要找的节点。思路很简单,深搜一遍就可以了。关键是存储,要用邻接表。表示之前完全不知道又邻接表这回事。。。图论一点没看- -!憋了N天(N>10)。。。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node
{
int v;
Node *next;
}* head[110005],tree[110008];
int n,ptr;
int sum[50005];
int mxs[50005];
void Init()
{
ptr=1;
for(int i=0;i<=n;i++)
sum[i]=1;
memset(head,NULL,sizeof(head));
memset(mxs,-1,sizeof(mxs));
}
void add(int x,int y)
{
tree[ptr].v=y;
tree[ptr].next=head[x];
head[x]=&tree[ptr++];
tree[ptr].v=x;
tree[ptr].next=head[y];
head[y]=&tree[ptr++];
}
int Find(int rt,int par)
{
Node *p=head[rt];
while(p!=NULL)
{
if(p->v!=par)
{
int x=Find(p->v,rt);
if(x>mxs[rt])mxs[rt]=x;
sum[rt]+=x;
}
p=p->next;
}
return sum[rt];
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
Init();
int a,b;
for(int i=1;i<n;i++)
{
scanf("%d%d",&a,&b);
add(a,b);
}
b=Find(1,1);
int r[50005];
int top=0;
int maxv=50000;
for(int i=1;i<=n;i++)
{
a=max(n-sum[i],mxs[i]);
if(i==1)a=mxs[1];
if(a<maxv)
{
top=0;
r[top++]=i;
maxv=a;
}
else if(a==maxv)
{
r[top++]=i;
}
}
for(int i=0;i<top;i++)
{
printf("%d ",r[i]);
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: