F. Asya And Kittens
http://codeforces.com/contest/1131/problem/F
给你一个n(n<=150000)
接下来n-1行 x y
按顺序代表x y所属的集合是相邻的并把它们并成一个集合
问你原来的集合是怎么样的,输出
要考虑到按顺序结合,应该放前面还是放后面,用并查集维护最前面,前一个,后一个,最后面
记得输出要有break
不然比如
2
2 1
就无法停止
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int nxt[maxn],fa[maxn],rev[maxn],pre[maxn];
int Find(int x)
{
if(x==fa[x]) return x;
return fa[x]=Find(fa[x]);
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
nxt[i]=pre[i]=0;
rev[i]=fa[i]=i;
}
for(int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
int fx=Find(x),fy=Find(y);
nxt[fx]=rev[fy];
pre[rev[fy]]=fx;
rev[fy]=rev[fx];
fa[fx]=fy;
}
for(int i=1;i<=n;i++)
{
//cout<<i<<" "<<rev[i]<<" "<<last[i]<<endl;
if(!pre[i])
{
while(nxt[i])
{
printf("%d ",i);
i=nxt[i];
}
printf("%d ",i);
break;
}
}
return 0;
}