解题思路:先用bfs判断可不可到达,能够到达再暴力搜索就OK了。
因为数据量很小,我使用的是邻接矩阵,这些可以保证字典序,如果使用邻接表,还要对每个vector节点进行排序。
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=25;
int v[maxn][maxn];
int goal,tot=0;
int ans[maxn],vis[maxn];
inline void print(int cur){
printf("%d",ans[0]);
for(int i=1;i<=cur;i++){
printf(" %d",ans[i]);
}
printf("\n");
}
void dfs(int cur){
if(ans[cur]==goal){
tot++;
print(cur);
return;
}
for(int i=2;i<=20;i++){
if(!vis[i]&&v[ans[cur]][i]){
vis[i]=1;
ans[cur+1]=i;
dfs(cur+1);
vis[i]=0;
}
}
}
bool is_access(){
queue<int>q;
q.push(1);
vis[1]=1;
while(!q.empty()){
int temp=q.front();
q.pop();
if(temp==goal) return true;
for(int i=2;i<=20;i++){
if(!vis[i]&&v[temp][i]){
q.push(i);
vis[i]=1;
}
}
}
return false;
}
int main(){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int from,to,kase=0;
while(scanf("%d",&goal)==1){
tot=0;
memset(vis,0,sizeof(vis));
memset(v,0,sizeof(v));
while(true){
scanf("%d%d",&from,&to);
if(!from) break;
v[from][to]=v[to][from]=1;
}
printf("CASE %d:\n",++kase);
if(is_access()){
memset(vis,0,sizeof(vis));
ans[0]=1;
vis[1]=1;
dfs(0);
}
printf("There are %d routes from the firestation to streetcorner %d.\n",tot,goal);
}
return 0;
}