UVA 208 (DFS)

题意:找出1到T的所有路径;

坑点:一开始以为是到终点,读错了题意,没测试第二个样例,结果WA了4遍,坑大了;

 1 #include <iostream>
 2 #include <cmath>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cstdlib>
 6 #include <sstream>
 7 #include <algorithm>
 8 #define Max 2147483647
 9 #define INF 0x7fffffff
10 #define N 90000+2
11 #define M 40000
12 #define ll long long
13 #define mem(a,b) memset(a,b,sizeof(a))
14 #define repu(i, a, b) for(int i = (a); i < (b); i++)
15 #define repd(i, a, b) for(int i = (a-1); i >= (b); i--)
16 const double PI=-acos(-1.0);
17 using namespace std;
18 const int maxn = 999999;
19 int t = 0, v, sum, T;
20 int rec[30],vis[30];
21 int g[30][30] ,floyd[30][30];
22 void dfs(int x,int n)
23 {
24     if(x==T)///到终点输出
25     {
26         printf("%d" ,1);
27         repu(i,1,n-1)
28         printf(" %d",rec[i]);
29         printf(" %d\n",T);
30         sum++;
31         return ;
32     }
33     repu(i,1,v+1)
34     {
35         if(!vis[i]&&g[x][i]==1&&floyd[T][i]!=maxn)
36         {///i点能到达终点+x,i通路+未访问过
37             rec[n]=i;
38             vis[i]=1;
39             dfs(i,n+1);
40             vis[i]=0;
41         }
42     }
43 }
44 int main()
45 {
46     int x, y, cas = 1;
47     while (~scanf("%d", &T))
48     {
49         v = 0;
50         repu(i,1,22)
51         repu(j,1,22)
52         g[i][j] = floyd[i][j] = maxn;
53         while(scanf("%d%d", &x, &y) && (x || y))
54         {
55             g[x][y] = g[y][x] = 1;///无向图
56             floyd[x][y] = floyd[y][x] = 1;
57             v = max(v,max(x,y));///找最大点
58         }
59         for(int k = 1; k <= v; k++)///弗洛伊德算法找最短路,判断两点之间是否是通路
60             for (int i = 1; i <= v; i++)
61                 for (int j = 1; j <= v; j++)
62                     floyd[i][j] = min(floyd[i][j],floyd[i][k] + floyd[k][j]);
63         vis[1] = 1;
64         sum = 0;
65         printf("CASE %d:\n", cas++);
66         dfs(1, 1);///从第一组数找起
67         printf("There are %d routes from the firestation to streetcorner %d.\n", sum, T);
68     }
69     return 0;
70 }
DFS

 

转载于:https://www.cnblogs.com/ACMERY/p/4520598.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值