poj.org/problem?id=1041
又是一个需要按字典序输出欧拉路径的题 最讨厌了。
AC代码:
#include <vector>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 2010;
const int MAXM = 1000010;
const int INF = 0x3f3f3f3f;
int top,path[MAXM],vis[MAXM];
int degree[MAXN];
int home;
vector < pair <int, int> > vt[MAXN];
void Init(){
top = 0;
for(int i=0; i<=45; i++) vt[i].clear();
memset(vis, 0, sizeof(vis));
memset(degree, 0, sizeof(degree));
}
void DFS(int s){
for(int i=0; i<vt[s].size(); i++){
if(!vis[vt[s][i].first]){
vis[vt[s][i].first] = 1;
DFS(vt[s][i].second);
path[top++] = vt[s][i].first;
}
}
}
int main(){
int u,v,id;
while(1){
scanf("%d%d",&u,&v);
if(!u && !v) break;
Init();
home = min(u, v);
scanf("%d",&id);
degree[u]++,degree[v]++;
vt[u].push_back(make_pair(id, v));
vt[v].push_back(make_pair(id, u));
while(scanf("%d%d",&u,&v) == 2){
if(!u && !v) break;
home = min(u,v);
scanf("%d",&id);
degree[u]++,degree[v]++;
vt[u].push_back(make_pair(id, v));
vt[v].push_back(make_pair(id, u));
}
bool flag = false;
for(int i=1; i<MAXN; i++)
if(degree[i] & 1){
puts("Round trip does not exist.");
flag = true;
break;
}
if(flag) continue;
for(int i=1; i<MAXN; i++)
if(vt[i].size()) sort(vt[i].begin(), vt[i].end());//保证字典序
DFS(home);
for(int i=top-1; i>=0; i--)
printf("%d%s",path[i], i!=0 ? " " : "\n");
}
return 0;
}