https://vjudge.net/problem/UVA-208
连通性,解决无路问题
#include<iostream>
#include<cstring>
using namespace std;
const int N=21;
int des,cnt;
bool a[N][N],vis[N],go[N];
int ans[N];
void find_path(int n){
go[n]=1;
for(int i=1;i<=20;i++)
if(!go[i]&&a[n][i])
find_path(i);
}
void dfs(int n){
if(ans[n]==des){
int i;
for(i=1;i<n;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[i]);
cnt++;return;
}
for(int i=2;i<=20;i++)
if(a[ans[n]][i]&&!vis[i]&&go[i]){
ans[n+1]=i;
vis[i]=1;
dfs(n+1);
vis[i]=0;
}
}
int main(){
int z=1;
while(cin>>des){
printf("CASE %d:\n",z++);
memset(a,0,sizeof(a));
memset(vis,0,sizeof(vis));
memset(go,0,sizeof(go));
int x,y;
while(scanf("%d%d",&x,&y),x||y)
a[x][y]=a[y][x]=1;
cnt=0;
vis[1]=ans[1]=1;
find_path(des);
dfs(1);
printf("There are %d routes from the firestation to streetcorner %d.\n",cnt,des);
}
}