1、并查集判断图是否联通;
2、只有度数都为偶数才能构成欧拉回路;
3、满足1,2之后dfs搜索出一条路径,注意边从小到大搜索。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
int g[2000][2]; //g[i][0],g[i][1]表示编号i的边的左右连接点
int set[50];
char vis[2000];
int tot;
int first;
int deg[50];
int MAX;
vector<int> array;
void init(int n)
{
for(int i=0;i<n;i++)
{
set[i]=i;
}
first=1;
MAX=0;
array.clear();
memset(deg,0,sizeof(deg));
memset(vis,0,sizeof(vis));
memset(g,-1,sizeof(g));
}
int find(int x)
{
int i,j,r = x;
while (set[r] != r)
r = set[r];
i = x;
while (i != r)
{
j = set[i];
set[i] = r;
i = j;
}
return r;
}
void merge(int x,int y)
{
int k,q;
k=find(x);
q=find(y);
if(k==q) return;
set[q]=k;
}
void dfs(int start)
{
for(int i=1;i<=MAX;i++)
{
if(!vis[i]) continue;
if(g[i][0]==start)
{
vis[i]=0;
dfs(g[i][1]);
array.push_back(i);
}
else if(g[i][1]==start)
{
vis[i]=0;
dfs(g[i][0]);
array.push_back(i);
}
}
}
int main()
{
int n,m,num;
int start;
int i;
while(~scanf("%d%d",&n,&m))
{
if(!n&&!m) break;
init(50);
scanf("%d",&num);
start=min(n,m);
MAX=max(MAX,num);
g[num][0]=n;
g[num][1]=m;
deg[n]++;
deg[m]++;
vis[num]=1;
merge(n,m);
while(scanf("%d%d",&n,&m))
{
if(!n&&!m) break;
scanf("%d",&num);
g[num][0]=n;
g[num][1]=m;
deg[n]++;
deg[m]++;
merge(n,m);
vis[num]=1;
MAX=max(MAX,num);
}
int flag=1;
int root=0;
for(i=0;i<50;i++) //判断连通
{
if(!deg[i]) continue;
if(find(i)==i)
root++;
if(root==2) break;
}
if(root==2) {printf("Round trip does not exist.\n");continue;}
for(i=0;i<50;i++) //判断度数是否都为偶数
{
if(deg[i]&1)
flag=0;
}
if(!flag) {printf("Round trip does not exist.\n");continue;}
dfs(start);
for(i=array.size()-1;i>=0;i--)
if(first) {printf("%d",array[i]);first=0;}
else printf(" %d",array[i]);
putchar(10);
}
return 0;
}