题意:找出所有能到达目标地点的道路,最后输出总路线数
思路:刚开始看到之后觉得不难,就是DFS,然后回溯输出路线,但写完之后,交上去,就TLS,超时,看了下别人的题解,因为有21个结点,如果不剪枝会超时,所以先将与目标地点有关的点全部标记出来
#include<stdio.h>
#include<string.h>
#define N 22
int map[N][N], vis[N], a[N], b[N];
int n, x, y, cnt, t = 0, d;
void judge(int k){
b[k] = 1;
for(int i = 1; i < N; i++)
if (map[k][i] && !b[i])
judge(i);
}
void dfs(int m){
if(m == n){
cnt++;
printf("1");
for(int i = 1; i < d; i++)
printf(" %d", a[i]);
printf("\n");
}
for(int i = 1; i < N; i++){
if ((map[m][i] == 1 || map[i][m] == 1) && !vis[i] && b[i]){
a[d++] = i;
vis[i] = 1;
dfs(i);
vis[i] = 0;
d--;
}
}
return;
}
int main(){
while (scanf("%d", &n) != EOF){
memset(map, 0, sizeof(map));
memset(vis, 0, sizeof(vis));
memset(b, 0, sizeof(b));
while (scanf("%d%d", &x, &y) && x && y){
map[x][y] = 1;
map[y][x] = 1;
}
cnt = 0, d = 0;
a[d++] = 1;
printf("CASE %d:\n", ++t);
vis[1] = 1;
judge(n);
dfs(1);
printf("There are %d routes from the firestation to streetcorner %d.\n", cnt, n);
}
return 0;
}