题目大意:给你一个目的地,和 一些路。求起点能到达目的地的所有线路,每个结点只能经过一次
解题思路:要先检查哪些结点是不可能到达目的地的,先排除这些点,然后回溯查找所有可行的线路
#include <cstdio>
#include <cstring>
int edge[25][25], node[25] = {0}, road[25], valid[25], num, count;
void check(int move) {
valid[move] = 1;
for(int i = 2; i <= 25; ++i)
if(edge[move][i] && !valid[i])
check(i);
}
void dfs(int move, int sum) {
road[sum] = move;
if (move == num) {
for (int i = 0; i <= sum; i++)
printf(i == sum ? "%d\n" : "%d ", road[i]);
count++;
return ;
}
for (int i = 2; i < 25; i++)
if (edge[move][i] && !node[i] && valid[i]) { //下一个点必须是可以连接到目的地的且未走过
node[i] = 1;
dfs(i, sum + 1);
node[i] = 0;
}
}
int main() {
int a, b, t = 0;
while (scanf("%d", &num) != EOF) {
memset(edge, 0, sizeof(edge));
memset(valid, 0, sizeof(valid));
while (scanf("%d%d", &a, &b), a)
edge[a][b] = edge[b][a] = 1;
count = 0;
check(num); //排除掉不可能到达目的的点,不然会超时
printf("CASE %d:\n", ++t);
dfs(1, 0);
printf("There are %d routes from the firestation to streetcorner %d.\n", count, num);
}
return 0;
}