#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
const int N = 1e5+10;
vector<int>graph[N];//使用vector容器,相当于邻接表的作用,比邻接矩阵要快的多,但比邻接表慢点。
map<int,int>m;//使用映射实现离散化,因为城市的标号太大,存储起来占内存
int f[N]; //存储原值
bool vis[N];
int n;
int dfs(int cur,int step) {
if(step==n+1) {
printf("%d",f[cur]);
return 1;
}
for(int i=0; i<graph[cur].size(); i++) {
if(vis[graph[cur][i]]==0) {
vis[graph[cur][i]]=1;
if(dfs(graph[cur][i],step+1)) {
printf(" %d",f[cur]);
return 1;
}
}
vis[graph[cur][i]]=0;// 回溯
}
}
int main() {
while(scanf("%d",&n)!=EOF) {
int a,b,pos=0;
for(int i=0; i<=N; i++) {
graph[i].clear();
}
memset(vis,0,sizeof(vis));
m.clear();
for(int i=0; i<n; i++) {
scanf("%d%d",&a,&b);
if(!m[a]) m[a]=++pos,f[pos]=a;
if(!m[b]) m[b]=++pos,f[pos]=b;
graph[m[a]].push_back(m[b]);
graph[m[b]].push_back(m[a]);
}
int start=1;
for(int i=1; i<=n+1; i++) {
if(graph[i].size()==1) {
start=i;
break;
}
}
vis[start]=1;
dfs(start,1);
printf("\n");
}
return 0;
}
题目地址:http://codeforces.com/problemset/problem/29/C