题解:这个题还是先建立个邻接表,只不过在之前把所有邻接表都按照街道编号的大小都排了一次序,然后再进行欧拉路径的逆序输出
//拓扑排序输出边的序号
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2000;
int deg[N];
vector<pair<int,int> >adjlist[N];
bool vis[N];
int ans[N];
int top;
int start;
void add(int x,int y,int z)
{
adjlist[x].push_back(make_pair(z,y));
adjlist[y].push_back(make_pair(z,x));
}
bool input()
{
int x,y,z;
scanf("%d%d",&x,&y);
if(x==0&&y==0){
return false;
}
start=min(x,y);
for(int i=0;i<N;i++){
adjlist[i].clear();
}
memset(deg,0,sizeof(deg));
while(1){
scanf("%d",&z);
add(x,y,z);
deg[x]++;
deg[y]++;
scanf("%d%d",&x,&y);
if(x==0&&y==0){
break;
}
}
return true;
}
void dfs(int u)
{
for(int i=0;i<adjlist[u].size();i++){
if(!vis[adjlist[u][i].first]){
vis[adjlist[u][i].first]=true;
dfs(adjlist[u][i].second);
ans[top++]=adjlist[u][i].first;
}
}
}
void solve()
{
bool ok=true;
for(int i=0;i<N;i++){
if(!adjlist[i].empty()){
if(deg[i]&1){
ok=false;
break;
}
sort(adjlist[i].begin(),adjlist[i].end());
}
}
if(!ok){
printf("Round trip does not exist.\n\n");
return ;
}
top=0;
memset(vis,false,sizeof(vis));
dfs(start);
for(int i=top-1;i>=0;i--){
printf("%d%s",ans[i],i?" ":"\n\n");
}
}
int main()
{
while(input()){
solve();
}
return 0;
}