John's trip POJ - 1041-无向图欧拉回路-路径输出

题目链接:http://poj.org/problem?id=1041

给你一个无向图,数据格式如点x 点y 边Z,表示由x点和y点构成了Z边。现在要问你该图中是否存在欧拉回路,如果存在,输出那条欧拉回路(输入按序走过的所有边标号)。且题目中保证了该无向图是连通的。

这里注意dfs中无向图中遍历需要edge[i^1].flag=true;

最后把edge[ans[i]].id所对应的边编号输出

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<math.h>
#include<set>
#include<vector>
#include<sstream>
#include<queue>
#define ll long long
#define PI 3.1415926535897932384626
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=6000;
struct Edge
{
    int to,next,id;
    bool flag;
}edge[maxn];
int head[maxn];
int in[maxn];
int tot;
void init()
{
    tot=0;
    memset(head,-1,sizeof(head));
    memset(in,0,sizeof(in));
}
void addedge(int u,int v,int w)
{
    edge[tot].to=v;
    edge[tot].next=head[u];
    edge[tot].id=w;
    edge[tot].flag=false;
    head[u]=tot++;
}
int start,maxs;
vector<int>ans;
void dfs(int x)
{
    for(int i=head[x];i!=-1;i=edge[i].next)
    {
        if(!edge[i].flag)
        {
            edge[i].flag=true;
            edge[i^1].flag=true;
            dfs(edge[i].to);
        ans.push_back(i);

        }
    }
}
int main()
{
    int x,y,c;
    while(scanf("%d%d",&x,&y))
    {
        if(x==0&&y==0)break;
        init();
        scanf("%d",&c);
        addedge(x,y,c);
        addedge(y,x,c);
        in[x]++;
        in[y]++;
        start=min(x,y);
        maxs=c;
        while(scanf("%d%d",&x,&y))
        {
            if(x==0&&y==0)break;
            scanf("%d",&c);
            maxs=max(c,maxs);
            addedge(x,y,c);
            addedge(y,x,c);
            in[x]++;
            in[y]++;
        }
        int cc=1;
        for(int i=1;i<=maxn;i++)
        {
            if(in[i]%2!=0){
                cc=0;
                //cout<<i<<endl;
                break;
            }
        }
        if(cc==0){puts("Round trip does not exist.");
            continue;}
        ans.clear();
        dfs(start);
        for(int i=0;i<ans.size();i++)
        {
            if(i==0)printf("%d",edge[ans[i]].id);
            else
            printf(" %d",edge[ans[i]].id);
        }
        cout<<endl;

    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41568836/article/details/82024015
今日推荐