题意:已知终点节点n,起点始终为1,求出所有的1->n的所有路径并输出
思路:回溯,但是直接会tle,需要优化一下,因为可能一个点dfs下去很深某个点该点是与终点处于两个不同的联通块中,这样的dfs就是无效的,所以可以先从终点dfs,找到所有与终点处于同一个联通块中的点,只有这些点才能深搜下去。由于数据范围很小,也可以用弗洛伊德跑一遍,判断一个点能否到达终点。第二次做这题了,但是还是没想到
代码:
#include<cstdio>
#include<queue>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=106;
int g[maxn][maxn];
int vis[maxn];
int ans[maxn];
int vv[maxn];
int viss[maxn];
int n;
int res=0;
int kk=0;
void dfs(int st,int k){
if(st==n){
for(int i=0;i<k;i++){
if(i!=0)printf(" ");
printf("%d",ans[i]);
}
printf("\n");
res++;
return;
}
for(int i=1;i<21;i++){
if(g[st][i]&&!vis[i]&&viss[i]){
vis[i]=1;
ans[k]=i;
dfs(i,k+1);
vis[i]=0;
}
}
}
void dfs(int cur){
vv[kk++]=cur;
viss[cur]=1;
for(int i=1;i<21;i++){
if(!viss[i]&&g[cur][i]){
dfs(i);
}
}
}
int main(){
int ca=1;
while(~scanf("%d",&n)){
kk=0;
memset(g,0,sizeof(g));
memset(viss,0,sizeof(viss));
res=0;
int x,y;
while(scanf("%d%d",&x,&y),(x+y)){
g[x][y]=g[y][x]=1;
}
dfs(n);
sort(vv,vv+kk);
printf("CASE %d:\n",ca++);
vis[1]=1;
ans[0]=1;
dfs(1,1);
printf("There are %d routes from the firestation to streetcorner %d.\n",res,n);
}
}