题目链接: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;
}