题意:n个人连成环,然后输入n对数,每对数表示第i个人后边是哪两个人,但不知道两个人的位置,让你找出这个环。输出任意一种。
思路:这n对数的每两个点肯定相连,n个人必定连成环,总共则有n条边,那么这n对数则为那n条边,然后就可以任选一个点进行dfs把所有的点找出来,一定要注意方向,一个人直接相连着两个人,一个为他前面的,一个为他后面的,第一个搜的肯定为他后边的一个人,不是他前面那个人,判断一下第一个会搜到哪个人,如果不是他后面的那个人,交换一下。
如果看不懂思路,可直接看代码,代码思路很清晰。
#include <bits/stdc++.h>
using namespace std;
const int MAXN=200010;
struct node
{
int u,v;
int next;
}a[2*MAXN];
int ans[MAXN];
int head[MAXN],cnt;
int vis[MAXN];
void add(int u,int v)
{
a[cnt].u=u;
a[cnt].v=v;
a[cnt].next=head[u];
head[u]=cnt++;
}
int o;
void dfs(int x)
{
ans[o++]=x;
vis[x]=1;
for(int i=head[x];i!=-1;i=a[i].next)
{
if(vis[a[i].v]==1)
continue;
dfs(a[i].v);
}
}
int main()
{
memset(head,-1,sizeof(head));
cnt=1;
int n;
int u,v;
scanf("%d",&n);
int xx,yy;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
if(i==1)
xx=u,yy=v;
}
o=0;
memset(vis,0,sizeof(vis));
if(a[head[1]].v!=xx&&a[head[1]].v!=yy)
swap(a[head[1]].v,a[a[head[1]].next].v);
dfs(1);
for(int i=0;i<o-1;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[o-1]);
return 0;
}