题目:

给出一个结点d和一个无向图中所有的边,按字典序输出这个无向图中所有从1到d的路径。

思路:

1.看到紫书上的提示,如果不预先判断结点1是否能直接到达结点d,上来就直接dfs搜索的话会超时,于是就想到了用并查集来预先判断是否属于同一个连通分量。

2.可以将与d属于同一个连通分量的点用一个数组保存起来,然后dfs搜索这个数组就可以了,这也就是只搜索了与d在一个连通分量里的点。

3.当搜索到d的时候就输出路径。

代码:

  1. #include <bits/stdc++.h>
  2. #define inf 0x3f3f3f3f
  3. #define MAX 1e3
  4. #define FRE() freopen("in.txt","r",stdin)
  5. #define FRO() freopen("out.txt","w",stdout)
  6. using namespace std;
  7. typedef long long ll;
  8. const int maxn = ;
  9. bool mp[maxn][maxn];
  10. int fa[maxn],d,lk[maxn],vis[maxn];
  11. int idx,path[maxn],cnt;
  12.  
  13. void init(){
  14. for(int i=; i<maxn; i++){
  15. fa[i] = i;
  16. }
  17. memset(lk,,sizeof(lk));
  18. memset(vis,,sizeof(vis));
  19. memset(mp,,sizeof(mp));
  20. memset(path,,sizeof(path));
  21. }
  22.  
  23. int _find(int x){//并查集查找祖先
  24. return fa[x]==x ? x : fa[x] = _find(fa[x]);
  25. }
  26.  
  27. void mergeNode(int x,int y){//合并不属于同一个连通分量的两个点
  28. int tx = _find(x),ty = _find(y);
  29. if(tx != ty){
  30. fa[tx] = ty;
  31. }
  32. }
  33.  
  34. bool isLinked(int x,int y){//判断两个点是不是属于同一个连通分量
  35. if(_find(x)!=_find(y)){
  36. return false;
  37. }
  38. return true;
  39. }
  40.  
  41. void DFS(int now, int MX){
  42. if(now==d){//搜索到d就输出;路径
  43. cnt++;
  44. printf("");
  45. for(int i=; i<MX; i++){
  46. printf(" %d",path[i]);
  47. }
  48. printf("\n");
  49. }else{
  50. //cout<<now<<endl;
  51. for(int i=; i<idx; i++){
  52. int u = lk[i];
  53. if(!vis[u] && mp[now][u]){
  54. vis[u] = true;
  55. path[MX] = u;//这里其实没必要另开一个数组保存路径,在下一个循环的时候当前的路径已经输出或没用了
  56. DFS(u,MX+);
  57. vis[u] = false;
  58. }
  59. }
  60. }
  61. }
  62.  
  63. void check(){
  64. for(int i=; i<idx; i++){
  65. printf("%d ",lk[i]);
  66. }
  67. printf("\n");
  68. }
  69.  
  70. int main(){
  71. //FRE();
  72. int kase=;
  73. while(scanf("%d",&d)!=EOF){
  74. int st,en;
  75. init();
  76. while(scanf("%d%d",&st,&en)&&st){
  77. mp[st][en] = ;
  78. mp[en][st] = ;
  79. mergeNode(st,en);
  80. }
  81. printf("CASE %d:\n",++kase);
  82. if(isLinked(,d)==false){
  83. printf("There are 0 routes from the firestation to streetcorner %d.\n",d);
  84. }else{
  85. idx=;
  86. for(int i=; i<maxn; i++){//找到与d在同一个连通分量里边的点并保存
  87. if(isLinked(i, d)){
  88. lk[idx++] = i;
  89. }
  90. }
  91. sort(lk,lk+idx);//从小到大排序,保证字典序
  92. //check();
  93. cnt = ;
  94. DFS(, );
  95. printf("There are %d routes from the firestation to streetcorner %d.\n",cnt,d);
  96. }
  97. }
  98. return ;
  99. }

UVA - 208 Firetruck(并查集+dfs)的更多相关文章

  1. UVA - 208 Firetruck(消防车)(并查集+回溯)

    题意:输入着火点n,求结点1到结点n的所有路径,按字典序输出,要求结点不能重复经过. 分析:用并查集事先判断结点1是否可以到达结点k,否则会超时.dfs即可. #pragma comment(link ...

  2. HDU 1232 并查集/dfs

    原题: http://acm.hdu.edu.cn/showproblem.php?pid=1232 我的第一道并查集题目,刚刚学会,我是照着<啊哈算法>这本书学会的,感觉非常通俗易懂,另 ...

  3. 1021.Deepest Root (并查集+DFS树的深度)

    A graph which is connected and acyclic can be considered a tree. The height of the tree depends on t ...

  4. POJ1291-并查集/dfs

    并查集 题意:找出给定的这些话中是否有冲突.若没有则最多有多少句是对的. /* 思路:如果第x句说y是对的,则x,y必定是一起的,x+n,y+n是一起的:反之x,y+n//y,x+n是一起的. 利用并 ...

  5. UVa 208 - Firetruck 回溯+剪枝 数据

    题意:构造出一张图,给出一个点,字典序输出所有从1到该点的路径. 裸搜会超时的题目,其实题目的数据特地设计得让图稠密但起点和终点却不相连,所以直接搜索过去会超时. 只要判断下起点和终点能不能相连就行了 ...

  6. F2 - Spanning Tree with One Fixed Degree - 并查集+DFS

    这道题还是非常有意思的,题意很简单,就是给定一个图,和图上的双向边,要求1号节点的度(连接边的条数)等于K,求这棵树的生成树. 我们首先要解决,如何让1号节点的度时为k的呢???而且求的是生成树,意思 ...

  7. UVA208-Firetruck(并查集+dfs)

    Problem UVA208-Firetruck Accept:1733  Submit:14538 Time Limit: 3000 mSec  Problem Description The Ce ...

  8. 2018 计蒜之道复赛 贝壳找房魔法师顾问(并查集+dfs判环)

    贝壳找房在遥远的传奇境外,找到了一个强大的魔法师顾问.他有 22 串数量相同的法力水晶,每个法力水晶可能有不同的颜色.为了方便起见,可以将每串法力水晶视为一个长度不大于 10^5105,字符集不大于  ...

  9. Codeforces 455C Civilization(并查集+dfs)

    题目链接:Codeforces 455C Civilization 题目大意:给定N.M和Q,N表示有N个城市,M条已经修好的路,修好的路是不能改变的.然后是Q次操作.操作分为两种.一种是查询城市x所 ...

随机推荐

  1. UVA 213 Message Decoding 【模拟】

    题目链接: https://cn.vjudge.net/problem/UVA-213 https://uva.onlinejudge.org/index.php?option=com_onlinej ...

  2. SQL Server: Difference between PARTITION BY and GROUP BY

    https://stackoverflow.com/questions/2404565/sql-server-difference-between-partition-by-and-group-by ...

  3. USACO Section 1.2PROB Transformations

    挺有趣的一道题,呵呵,不算难 /* ID: jusonal1 PROG: transform LANG: C++ */ #include <iostream> #include <f ...

  4. 【USACO 2017FEB】 Why Did the Cow Cross the Road III

    [题目链接] 点击打开链接 [算法] 树状数组 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 100010 ...

  5. vue的学习网址

    Vue官网:http://cn.vuejs.org/v2/guide/index.html 淘宝镜像:http://npm.taobao.org/ Vue-router:https://router. ...

  6. 【149】ArcGIS Desktop 10.0 & Engine 10.0 安装及破解

    写在前面:可能会出现按照此方法无法破解的情况,那请确保您有将 ArcGIS 10.0 已经完全卸载干净,直接通过控制面板进行卸载的时候并不能将其卸载干净,需要进行更深层次的卸载,包括删除注册表,各种文 ...

  7. bzoj 1026: [SCOI2009]windy数【数位dp】

    忘记limit不能记WA了一发-- 典型数位dp,变成work(r)-work(l-1),然后dfs的时候记录w当前位置,la上一个数选的什么,lm当前位是否有上限,ok当前位是否可以不考虑差大于等于 ...

  8. bzoj 1577: [Usaco2009 Feb]庙会捷运Fair Shuttle【贪心+线段树】

    按结束时间排序,然后开个线段树,按照排序后的牛群贪心的选 贪心的依据是选哪头牛都是选,不如给后面的多省一点空间 #include<iostream> #include<cstdio& ...

  9. [读书笔记2]《C语言嵌入式系统编程修炼》

    第3章 屏幕操作   3.1 汉字处理 现在要解决的问题是,嵌入式系统中经常要使用的并非是完整的汉字库,往往只是需要提供数量有限的汉字供必要的显示功能.例如,一个微波炉的LCD上没有必要提供显示&qu ...

  10. I - Andy's First Dictionary(set+stringstream)

    Description Andy, 8, has a dream - he wants to produce his very own dictionary. This is not an easy ...