回溯搜索题 不能裸搜,因为有终点和起点不连通的情况 可以从终点DFS一次找出联通标记出后再用DFS回溯出来 也可以用并查集( 但是写并查集好累啊!) 还有输出格式有点坑,1前面是没空格的
#include<bits/stdc++.h>
using namespace std;
int n;
vector<int>a1[300];
int vis[25];
int liantong[25];
int cnt=0;
int ans[25];
int mp[25][25];
void per_dfs(int x){
liantong[x]=1;
for(int i=1;i<22;i++){
if(!liantong[i]&&mp[x][i]){
liantong[i]=1;
per_dfs(i);
}
}
}
void dfs(int x,int dep){
// printf("%d",x);
vis[x]=1;
if(x==n){
// cout<<11<<endl;
a1[cnt].push_back(1);
for(int i=0;i<dep;i++){
a1[cnt].push_back(ans[i]);
}
cnt++;
return ;
}
for(int i=1;i<22;i++){
if(liantong[i]&&!vis[i]&&mp[x][i]){
vis[i]=1;
ans[dep]=i;
dfs(i,dep+1);
vis[i]=0;
}
}
}
int main(){
int kase=1;
while(scanf("%d",&n)==1&&n){
for(int i=0;i<200;i++)a1[i].clear();
memset(liantong,0,sizeof(liantong));
memset(mp,0,sizeof(mp));
memset(vis,0,sizeof(vis));
cnt=0;
int a,b;
while(scanf("%d%d",&a,&b)==2&&a){
mp[a][b]=mp[b][a]=1;
}
per_dfs(n);
printf("CASE %d:\n",kase++);
if(liantong[1]){
dfs(1,0);
for(int i=0;i<cnt;i++){
for(int j=0;j<a1[i].size();j++){
if(j==0){
printf("1");
}
else printf(" %d",a1[i][j]);
}
printf("\n");
}
printf("There are %d routes from the firestation to streetcorner %d.\n",cnt,n);
}
else printf("There are 0 routes from the firestation to streetcorner %d.\n",n);
}
return 0;
}