LOJ-10109(欧拉回路)

题目链接:传送门

思路:

就是简单的找欧拉回路,不过要注意dfs边时要将边的编号/2,不然会分不清那条边每被遍历。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1e5+10;
int head[maxn],vis[maxn],ver[maxn],next[maxn],id[maxn],tot;
int ans[maxn],tt,du[maxn];
int MAX(int x,int y)
{
    return x>y?x:y;
}
void Init()
{
    memset(vis,0,sizeof(vis));
    memset(head,0,sizeof(head));
    memset(du,0,sizeof(du));
    tot=0;tt=0;
}
void addedge(int u,int v,int w)
{
    ver[++tot]=v;next[tot]=head[u];id[tot]=w;head[u]=tot;
}
void dfs(int u)
{
    for(int i=head[u];i;i=next[i]){
        int v=ver[i];
        if(!vis[(i+1)>>1]){
            vis[(i+1)>>1]=1;
            dfs(v);
            ans[++tt]=id[i];
        }
    }
}
int main(void)
{
    int n,m,x,y,z,i,j,ss;
    while(scanf("%d%d",&x,&y)&&(x+y)){
        Init();
        scanf("%d",&z);
        du[x]++;du[y]++;
        ss=x<y?x:y;
        n=MAX(x,y);m=1;
        addedge(x,y,z);addedge(y,x,z);
        while(scanf("%d%d",&x,&y)&&(x+y)){
            scanf("%d",&z);
            n=MAX(n,MAX(x,y));m++;
            du[x]++;du[y]++;
            addedge(x,y,z);addedge(y,x,z);
        }
        int fg=1;
        for(i=1;i<=n;i++)
        if(du[i]%2){
            fg=0;break;
        } 
        
        if(fg==0) printf("Round trip does not exist.
");
        else{
            dfs(ss);
            if(m!=tt) printf("Round trip does not exist.
");
            else{
                for(i=tt;i>=2;i--) printf("%d ",ans[i]);
                printf("%d
",ans[1]);
            }
        }
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/2018zxy/p/10375150.html