题目大意: 给出无向图,每条边有唯一的序号,是否存在欧拉回路,若存在输出边序号最小字典序的路径。
下面代码没有判断图连通,根据题意图应该联通了,只需判断零个奇数点就可以了。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int M=45;
const int N=1995;
int gra[M][N]; //gra[i][j]=k表示点x经过边j到达点k
int ind[M];
int ans[N];
bool vis[N];
int cnt;
void dfs(int s)
{
for(int i=1;i<1995;i++)
if(gra[s][i]&&!vis[i])
{
vis[i]=true;
dfs(gra[s][i]);
ans[cnt++]=i;
}
}
int main()
{
int u,v,w;
while(scanf("%d%d",&u,&v))
{
memset(gra,0,sizeof(gra));
memset(ind,0,sizeof(ind));
memset(vis,false,sizeof(vis));
if(u==0&&v==0) break;
int start=min(u,v);
while(u!=0&&v!=0)
{
scanf("%d",&w);
gra[u][w]=v;
gra[v][w]=u;
ind[u]=!ind[u];
ind[v]=!ind[v];
scanf("%d%d",&u,&v);
}
int flag=0;
for(int k=1;k<M;k++)
if(ind[k]) flag=1;
if(flag)
{
puts("Round trip does not exist.");
continue;
}
cnt=0;
dfs(start);
for(int i=cnt-1;i>=0;i--)
printf("%d ",ans[i]);
printf("\n");
}
return 0;
}