Codeforces1095D. Circular Dance

题意: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;
}

猜你喜欢

转载自blog.csdn.net/cpx17852033609/article/details/85331176