这个注意连通的部分,直接追溯会超时。题目很好理解,注意是按照字典序还有从一开始。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <stdlib.h>
#include <string.h>
using namespace std;
const int maxn = 21 + 4;
bool g[maxn][maxn],vis[maxn];
int n;
int a[maxn];
int cnt;
void dfs(int num)
{
vis[num] = true;
for(int i = 1; i < maxn; i++)
if(g[i][num] && !vis[i])
dfs(i);
return;
}
void Search(int cur)
{
vis[1] = false;
if(a[cur] == n)
{
cnt++;
for(int i = 0; i <= cur; i++)
{
if(i)
cout<<" ";
cout<<a[i];
}
cout<<endl;
return;
}
else
{
for(int i = 1; i < maxn; i++)
{
if(g[a[cur]][i] && vis[i])
{
a[cur + 1] = i;
vis[i] = false;
Search(cur + 1);
vis[i] = true;
}
}
return;
}
}
int main()
{
ios::sync_with_stdio(false);
int num1,num2;
int num = 0;
while(scanf("%d",&n) == 1)
{
memset(g,0,sizeof(g));
memset(vis,0,sizeof(vis));
memset(a,0,sizeof(a));
while(scanf("%d%d",&num1,&num2) &&(num1||num2))
{
g[num1][num2] = g[num2][num1] = true;
}
cout<<"CASE "<<++num<<":"<<endl;
a[0] = 1;
vis[1] = false;
cnt = 0;
dfs(n);
if(!vis[1])
{
cout<<"There are "<<cnt<<" routes from the firestation to streetcorner "<<n<<"."<<endl;
}
else
{
Search(0);
cout<<"There are "<<cnt<<" routes from the firestation to streetcorner "<<n<<"."<<endl;
}
}
return 0;
}