UVa 208 - Firetruck 回溯+剪枝 数据
题意:构造出一张图,给出一个点,字典序输出所有从1到该点的路径。
裸搜会超时的题目,其实题目的数据特地设计得让图稠密但起点和终点却不相连,所以直接搜索过去会超时。
只要判断下起点和终点能不能相连就行了,可以用并查集也可以用floyd算法,这样就能过了。
但是这个方法不是很完美的,如果两点之间只有一条线相连,而图又是稠密图,这样也很容易超时,数据强电就会挂掉。
可以把算法改进一下:是先从终点出发,无回溯的走遍和终点相连的所有点并标记,然后从起点出发,DFS判断下标记,这样就不会多走很多路了。另一个方法是在把点并入并查集的时候不考虑起点,然后DFS只走和终点同一集合的点。
某位大神的博客上说Tarjan算法也可以很好的实现。
我的代码是floyd算法:
#include <cstdio>
#include <cstring>
const int maxn = 999999;
int t = 0, v, sum, f;
int g[30][30], vis[30], floyd[30][30], rec[30]; void dfs(int x, int n) {
if (x == f) {
printf("1");
for (int i = 1; i < n - 1; i++)
printf(" %d", rec[i]);
printf(" %d\n", f);
sum++;
return;
}
for (int i = 1; i <= v; i++) {
if (!vis[i] && g[x][i] == 1 && floyd[f][i] != maxn) {
rec[n] = i;
vis[i] = 1;
dfs(i, n + 1);
vis[i] = 0;
}
}
} int main() {
int x, y, cas = 1;
while (scanf("%d", &f) != EOF) {
v = 0;
for (int i = 1; i <= 21; i++)
for (int j = 1; j <= 21; j++)
g[i][j] = floyd[i][j] = maxn;
while (scanf("%d%d", &x, &y) && (x || y)) {
g[x][y] = g[y][x] = 1;
floyd[x][y] = floyd[y][x] = 1;
if (x > v) v = x;
if (y > v) v = y;
}
for (int k = 1; k <= v; k++)
for (int i = 1; i <= v; i++)
for (int j = 1; j <= v; j++)
if (floyd[i][k] + floyd[k][j] < floyd[i][j])
floyd[i][j] = floyd[i][k] + floyd[k][j];
vis[1] = 1;
sum = 0;
printf("CASE %d:\n", cas++);
dfs(1, 1);
printf("There are %d routes from the firestation to streetcorner %d.\n", sum, f);
}
return 0;
}
Input:
14
1 8
2 11
3 4
3 6
4 14
5 6
5 8
6 11
6 12
8 14
9 14
10 14
11 14
0 0
Output:
CASE 1:
1 8 5 6 3 4 14
1 8 5 6 11 14
1 8 14
There are 3 routes from the firestation to streetcorner 14.
UVa 208 - Firetruck 回溯+剪枝 数据的更多相关文章
- UVa 208 Firetruck【回溯】
题意:给出一个n个节点的无向图,以及某个节点k,按照字典序从小到大输出从节点1到节点k的所有路径 看的题解 http://blog.csdn.net/hcbbt/article/details/975 ...
- UVA - 208 Firetruck(消防车)(并查集+回溯)
题意:输入着火点n,求结点1到结点n的所有路径,按字典序输出,要求结点不能重复经过. 分析:用并查集事先判断结点1是否可以到达结点k,否则会超时.dfs即可. #pragma comment(link ...
- Uva 208 - Firetruck
[题目链接]http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&p ...
- UVA - 208 Firetruck(并查集+dfs)
题目: 给出一个结点d和一个无向图中所有的边,按字典序输出这个无向图中所有从1到d的路径. 思路: 1.看到紫书上的提示,如果不预先判断结点1是否能直接到达结点d,上来就直接dfs搜索的话会超时,于是 ...
- 回溯剪枝,dfs,bfs
dfs: 给定一个整数n,将数字1~n排成一排,将会有很多种排列方法. 现在,请你按照字典序将所有的排列方法输出. 输入格式 共一行,包含一个整数n. 输出格式 按字典序输出所有排列方案,每个方案占一 ...
- HDU 5113 Black And White 回溯+剪枝
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5113 Black And White Time Limit: 2000/2000 MS (Java/ ...
- uva 509 RAID!(磁盘数据)
来自 https://blog.csdn.net/su_cicada/article/details/80085318 习题4-7 RAID技术(RAID!, ACM/ICPC World Final ...
- HDU 2553 N皇后问题(回溯 + 剪枝)
本文链接:http://i.cnblogs.com/EditPosts.aspx?postid=5398797 题意: 在N*N(N <= 10)的方格棋盘放置了N个皇后,使得它们不相互攻击(即 ...
- HDU1010 Tempter of the Bone(回溯 + 剪枝)
本文链接:http://i.cnblogs.com/EditPosts.aspx?postid=5398734 题意: 输入一个 N * M的迷宫,这个迷宫里'S'代表小狗的位置,'X'代表陷阱,‘D ...
随机推荐
- It's only too late if you decide it is. Get busy living, or get busy dying(转)
我们的身边是不是有这样的一群人,他们心肠不坏,容易感伤,但吐槽似乎是常有的事情,看着时下电视电影,说起哪些哪些自己的泪点.一般都是吃货,别人失眠的时候,TA可能在回忆自己刚做了什么梦.我不是要去评论这 ...
- C++传递函数指针
函数指针是一个很好的类型.因此,您可以编写一个函数,它的一个参数是一个函数指针.然后.在(外部)当函数使用的函数指针参数,来间接调用时调用相应的参数的函数的函数. 因为指针在不同的情况下能够指向不同的 ...
- json级联城市
代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> < ...
- hdu 1394 Minimum Inversion Number(线段树之 单点更新求逆序数)
Minimum Inversion Number T ...
- 工程PMO工作
算起来,这是第一次以项目PMO人员的身份參与项目.尽管非常可惜没有从头參与,也没有參与到项目结束.仅仅有短短的两个月,但对项目PMO也可略窥一斑.如今就当个流水账写一写吧. 进项目组的时候,是中 ...
- CentOS 6 安装Oracle11g
原创作品.从 "深蓝blog" 博客,欢迎转载,请务必注明转载如下源.否则追究其版权责任. 深蓝的blog:http://blog.csdn.net/huangyanlong/ar ...
- NETSH WINSOCK RESET这个命令的意义和效果?
简要地netsh winsock reset命令含义复位 Winsock 文件夹.一机多用的假设Winsock协议配置问题,那么问题会导致网络连接,我们需要使用netsh winsock reset命 ...
- add-apt-repository
也许你早已注意到,我们在介绍软件的时候,在安装这块一般都提供 PPA 源安装方式,这是一种快速方便的软件安装方法,但对于一些新手来说,对 PPA 并不是很熟悉,下面我们就详细介绍一下. # 我们先了解 ...
- 使用JSP实现商场购物车模块
这些日子,学习JSP,只要找到一个小模块来试试你的手: 这里是实现车模块结果页面截图: 图1. 产品显示页面 通过此页面进行产品选择.增加到购物车 图2 .购物车页面 图3 . 商品数量设置 好了,先 ...
- 产品经理(五岁以下儿童)myVegas Slots排名上升的秘密
myVEGAS Slots于AppStore上排名在今年也就是2月份时候飙升,那么什么情况导致这个现象的呢,我们试图通过App Annie的分析给出答案. 上面是myVegas的排名情况,我们能够看到 ...