★ 实验任务
正如你所知道的 s_sin 是一个贪玩的不得了的小 P 孩 QAQ,你也知道他最近很喜欢玩一
个叫做太阳帝国的原罪的策略游戏去年他已经和疯狂的 AI 交战了整整一年。而现在,战斗
的序幕又要拉开了。 如果你没有忘记去年的 gungnir 和 Freya 的话, 今年他又带来了新武器,
命名为 Cassandra。
已知疯狂的 AI 占领了 n 个行星,这 n 个行星中有 n-1 个通道保证他们之间连通。(我们
把 n 个行星和它们之间的 n-1 个通道称为 1 个 n 元行星群)而敌方的物资就是通过这些通道
在行星之间流动。现在 Cassandra 的能力是能够直接摧毁所有通往某个行星 xi 的通道。而
作为机智的 s_sin 他所希望的目的是,在摧毁通往某个行星 xi 的所有通道之后,使得其余
的若干个行星群中元数最大的最小。请按照字典序输出所有 xi
★ 数据输入
输入第一行为一个正整数 N (2 < N < =30000), 表示敌方占有的 n 个行星
接下来 n-1 行,每行三个整数 a b,表示编号 a b 行星之间有一条相位转移通道。
其中 50% (1<N<=10000)
正如你所知道的 s_sin 是一个贪玩的不得了的小 P 孩 QAQ,你也知道他最近很喜欢玩一
个叫做太阳帝国的原罪的策略游戏去年他已经和疯狂的 AI 交战了整整一年。而现在,战斗
的序幕又要拉开了。 如果你没有忘记去年的 gungnir 和 Freya 的话, 今年他又带来了新武器,
命名为 Cassandra。
已知疯狂的 AI 占领了 n 个行星,这 n 个行星中有 n-1 个通道保证他们之间连通。(我们
把 n 个行星和它们之间的 n-1 个通道称为 1 个 n 元行星群)而敌方的物资就是通过这些通道
在行星之间流动。现在 Cassandra 的能力是能够直接摧毁所有通往某个行星 xi 的通道。而
作为机智的 s_sin 他所希望的目的是,在摧毁通往某个行星 xi 的所有通道之后,使得其余
的若干个行星群中元数最大的最小。请按照字典序输出所有 xi
★ 数据输入
输入第一行为一个正整数 N (2 < N < =30000), 表示敌方占有的 n 个行星
接下来 n-1 行,每行三个整数 a b,表示编号 a b 行星之间有一条相位转移通道。
其中 50% (1<N<=10000)
★ 数据输出 输出所有如题目描述中的 xi
输入示例 输出示例
6 2 3
1 2
2 3
2 5
3 4
3 6
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 30010
struct Node
{
int d,next;
}el[N*2];//结点
int n,t,s;
int f[N],vis[N],l[N];
int tem[N];
int main()
{
void add(int x,int y);
void dfs(int u);
memset(l,-1,sizeof(l));
memset(vis,0,sizeof(vis));
scanf("%d",&n);
int i,a,b;
t=0;
for(i=1;i<n;++i)
{
scanf("%d%d",&a,&b);
add(a,b);
}
s=n;
dfs(1);
sort(f+1,f+1+f[0]);
printf("%d",f[1]);
for(i=2;i<=f[0];++i)
printf(" %d",f[i]);
return 0;
}
void add(int x,int y)
{
el[t].d=y;
el[t].next=l[x];
l[x]=t++;
el[t].d=x;
el[t].next=l[y];
l[y]=t++;
}
void dfs(int u)
{
int q=-1;
vis[u]=1;
tem[u]=0;
for(int i=l[u];i!=-1;i=el[i].next)
{
int d=el[i].d;
if(vis[d])
continue;
dfs(d);
tem[u]+=1+tem[d];
if(q==-1 || tem[d]+1>q)
q=tem[d]+1;
}
if(n-tem[u]-1>q)
q=n-tem[u]-1;
if(q<s)
{
s=q;
f[0]=1,f[1]=u;
}
else
if(q==s)
{
f[++f[0]]=u;
}
}