题意:从某个点出发,经过所有点一遍,再次回到该点
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<queue>
#include<set>
#include<stack>
#define cl(a,b) memset(a,b,sizeof(a));
#define LL long long
#define P pair<int,int>
#define X first
#define Y second
#define pb push_back
#define out(x) cout<<x<<endl;
using namespace std;
const int maxn=21;
const int inf=9999999;
const int mod=100007;
vector<int> G[maxn];
int m;
int vis[maxn];
int ans[maxn];
int cas;
void dfs(int x,int len){
if((G[x][0]==m||G[x][1]==m||G[x][2]==m)&&len==20){
printf("%d: ",cas++);
for(int i=0;i<len;i++){
printf(" %d",ans[i]);
}
printf(" %d\n",m);
return ;
}
for(int i=0;i<3;i++)if(!vis[G[x][i]]){
vis[G[x][i]]=true;
ans[len]=G[x][i];
dfs(G[x][i],len+1);
vis[G[x][i]]=false;
}
}
int main(){
for(int i=0;i<maxn;i++)G[i].clear();
for(int i=1;i<maxn;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
G[i].pb(x);G[i].pb(y);G[i].pb(z);
sort(G[i].begin(),G[i].end());
}
while(~scanf("%d",&m)){
if(m==0)return 0;
cl(vis,false);
cas=1;
vis[m]=1;
ans[0]=m;
dfs(m,1);
}
return 0;
}