传送门:hdu 2181
中文题就不多说了,唯一值得注意的一点是dfs到最后cnt==20的时候要先判断最后一个城市和第一个城市连不连通再输出。
#include <iostream>
#include <cstdio>
#include <cstring>
int map[22][22];
int book[22];
int line[22];
int t=0,m;
using namespace std;
int dfs(int cnt)
{
if(cnt==20)
{
if(map[line[cnt-1]][m])//判断最后一个城市和第一个城市之间有没有边
{
printf("%d: ",++t);
printf("%d",m);
for(int i=1;i<20;i++)
{
printf(" %d",line[i]);
}
printf(" %d\n",m);
}
return 0;
}
for(int i=1;i<=20;i++)
{
if(!book[i]&&map[line[cnt-1]][i])
{
book[i]=1;
line[cnt]=i;
dfs(cnt+1);
book[i]=0;
}
}
return 0;
}
int main()
{
int a,b,c;
memset(map,0,sizeof(map));
for(int i=1;i<=20;i++)
{
scanf("%d%d%d",&a,&b,&c);
map[i][a]=1;
map[i][b]=1;
map[i][c]=1;
}
/*for(int i=1;i<=21;i++)
{
for(int j=1;j<=20;j++)
printf("%d ",map[i][j]);
putchar('\n');
}*/
while(scanf("%d",&m)&&m)
{
memset(book,0,sizeof(book));
line[0]=m;
book[m]=1;
t=0;
dfs(1);
}
return 0;
}