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

时间: 2024-10-08 09:37:30

UVA 208 (DFS)的相关文章

UVa 208 消防车(dfs+剪枝)

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=144 题意:给出一个n个结点的无向图以及某个结点k,按照字典序从小到大顺序输出从1到结点k的所有路径. 思路:如果直接矩阵深搜的话是会超时的,所以我们可以从终点出发,将与终点相连的连通块保存起来,这样dfs深搜时可以剪枝掉一些到达不了的点.只要解决了这个,dfs就是小问题. 这道题还有点坑的

UVa 208 救火车

题意:先给出离出火地点最近的路口,然后给出一些之间通畅的路口.要求给出所有从1号路口到火灾事故点的不含回路的简单路径. 思路:方法很容易想到,dfs即可.但是简单的dfs会超时,3s+. 之后看别人用了并查集,去了解了下并查集的思想.这里可以通过并查集提前判断一个路口是否和火灾路口想通,如果不通,则直接剪枝了.别看仅这一个优化,最后AC时间0.022,性能提升还是很多的.因为你早早地剪去一个结点,由它延伸下去的很多种情况都一并剪枝了的.也可以分析下直接dfs的复杂度,粗略地估算解答树结点的个数:

(判连通+暴力)UVA - 208 Firetruck

原题链接: 比较麻烦,就不挂,可以上uva live找,也可以用virtual judge挂题. 题意: 输出从1到k的所有路径,不能重复经过 分析: 这题就是简单的深搜回溯,用一个数组记录路径,满足条件时输出.紫书上说需要先判断1到k是否联通,不然会超时.交了一发直接深搜,果然TLE.所以需要先判连通. 判连通的方法有(能想到的): 1.dfs和bfs,两者感觉差不多,但是我选择的bfs 2.floyd,n^3的复杂度,但更加粗暴直接,也更好写 3.待添加 感悟: 不预先判连通3000ms超时

uva 818(dfs+图+状态压缩)

题意:有n个环,编号从1到n,给出了一些环环相扣的情况,比如给a和b表示a和b两个环的扣在一起的,每个环都是可以打开的,问最少打开多少个环,然后再扣好,可以让所有的环成为一条链. 题解:状态压缩把所有的打开环的情况枚举出来,然后拿去判断是否成立,更新打开环后的图g[i][j],和每个点的度数,不成立有三种情况,1.计算没有打开的环的度数,如果大于2说明不会有链,2.把没有打开环拿去dfs,访问过就vis[i]++,如果vis[i]>=2说明存在环,3.如果打开的环数num + 1小于链的数量,说

UVA 11853 [dfs乱搞]

/* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边的入口和出口的坐标. 思路: dfs乱搞题.把炮弹辐射范围连在一起的炮弹看作一个整体,记录下它围起来的边界区域. 然后找到最北边的输出. */ #include<bits/stdc++.h> using namespace std; double x[1005],y[1005],r[1005];

UVA Firetruck (DFS)

The Center City fire department collaborates with the transportation department to maintain maps of the city which reflects the current status of the city streets. On any given day, several streets are closed for repairs or construction. Firefighters

Firetruck UVA - 208

DFS+并查集 如果只用DFS的话会超时,用并查集剪枝,和起点终点不联通的点就不用跑了 这题有好多人写了博客,但是我觉得我的代码写的比较通俗易懂所以就贴上来了,我觉得我写代码的目标就是让任何人都能看懂,越小白越好(其实是因为真小白吧-- #include<bits/stdc++.h> using namespace std; int E[30][30]; int diste; int mark[30]; int path[30]; int fin[30]; int ans; int root[

uva 471(dfs)

题意:给出一个n,然后要得到所有的s1和s2满足,s1与s2都是位数不存在相等的数字,且s1 / s2 = n. 题解:纯暴力题,枚举s2,计算s1,然后判断s1和s2是否都是不重复数位的数字,终止条件是s1 > 9876543210. #include <stdio.h> long long n; int vis[10]; bool judge(long long x) { if (x > 9876543210) return false; for (int i = 0; i &

UVa 208 Firetruck【回溯】

题意:给出一个n个节点的无向图,以及某个节点k,按照字典序从小到大输出从节点1到节点k的所有路径 看的题解 http://blog.csdn.net/hcbbt/article/details/9755147 因为节点数很少(小于20),所以可以先用floyd处理一下,判断一点是否能够到达终点 然后就像紫书里面枚举排列那样的去挨个找出字典序从小到大的路径 题解里面说到的无回溯的走遍和终点相连的所有点,他写的代码是判断的d[en][i],判断终点到i点是否可达 写成d[i][en]也能过,因为是无