思路:因为这些数字大到可以达到10的九次方,但个数却不多,因此可以用map容器存储各个数字对应的位置,然后再用数组f[i]储存每个位置对应的数,用vector容器储存图的邻接表,方便访问。注意深搜时找到一条能够遍历到所有点的路径再输出,要用到回溯。
代码如下:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<map>
#include<vector>
using namespace std;
map<int,int>m;//起到去重作用,并且解决了数组无法开大的问题,m[a]=pos。储存每个数在数组中的位置
vector<int>graph[100005];//相当于无向图的邻接表
int f[100005];//第i个数的值
bool vis[100005];
int n;
int dfs(int cur,int dep){
if(dep==n+1){//如果这条路走得通,能够通过这条路访问到每一个数,就开始回溯输出
cout<<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],dep+1)){
cout<<" "<<f[cur];
return 1;
}
}
vis[graph[cur][i]]=0;//回溯
}
}
int main(){
int i,j,a,b,pos;
memset(vis,0,sizeof(vis));
cin>>n;
pos=0;
for(i=0;i<n;i++){
cin>>a>>b;
if(m[a]==0){m[a]=++pos;f[pos]=a;}
if(m[b]==0){m[b]=++pos;f[pos]=b;}
graph[m[a]].push_back(m[b]);
graph[m[b]].push_back(m[a]);
}
int start=1;
for(i=1;i<=n+1;i++){
if(graph[i].size()==1){
start=i;
break;
}
}//找到一个起点
vis[start]=1;
dfs(start,1);//深搜
cout<<endl;
return 0;
}