欧拉回路问题,判断比较简单,要求字典序的话用DFS搜索即可,注意从小到大搜索
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAX=2001;
const int inf=1<<29;
int map[MAX][MAX],cnt[MAX],vis[MAX],ver[MAX][MAX],ans[MAX],top;
int cmp(const void *a,const void *b)
{
return *(int*)a>*(int*)b;
}
void DFS(int x)
{
for(int i=0;i<cnt[x];i++)
{
int ita=ver[x][i];
if(!vis[ita])
{
vis[ita]=1;
DFS(map[x][ita]);
ans[top++]=ita;
}
}
}
int main()
{
int x,y,z,n,st,mini;
while(scanf("%d%d",&x,&y)&&(x||y))
{
memset(map,0,sizeof(map));
memset(cnt,0,sizeof(cnt));
scanf("%d",&z);
map[x][z]=y;
map[y][z]=x;
ver[x][cnt[x]++]=z;
ver[y][cnt[y]++]=z;
n=max(x,y);
mini=z;
st=x;
while(scanf("%d%d",&x,&y)&&(x||y))
{
scanf("%d",&z);
map[x][z]=y;
map[y][z]=x;
ver[x][cnt[x]++]=z;
ver[y][cnt[y]++]=z;
n=max(n,x);
n=max(n,y);
if(z<mini)
{
mini=z;
st=x;
}
}
int flag=0;
for(int i=0;i<=50;i++)
if(cnt[i]&1)
{
flag=1;
break;
}
if(flag)
printf("Round trip does not exist.\n");
else
{
for(int i=1;i<=n;i++)
sort(ver[i],ver[i]+cnt[i]);
memset(vis,0,sizeof(vis));
top=0;
DFS(st);
for(int i=top-1;i>=0;i--)
printf("%d%c",ans[i],i==0?'\n':' ');
}
printf("\n");
}
return 0;
}