UVA 208 - Firetruck

来源:互联网 发布:windows grub 修复 编辑:程序博客网 时间:2024/04/29 15:31

题目大意:给你一个目的地,和 一些路。求起点能到达目的地的所有线路,每个结点只能经过一次


解题思路:要先检查哪些结点是不可能到达目的地的,先排除这些点,然后回溯查找所有可行的线路

#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;}


0 0