题目:

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

思路:

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

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

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

代码:

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define MAX 1e3
#define FRE() freopen("in.txt","r",stdin)
#define FRO() freopen("out.txt","w",stdout)
using namespace std;
typedef long long ll;
const int maxn = ;
bool mp[maxn][maxn];
int fa[maxn],d,lk[maxn],vis[maxn];
int idx,path[maxn],cnt; void init(){
for(int i=; i<maxn; i++){
fa[i] = i;
}
memset(lk,,sizeof(lk));
memset(vis,,sizeof(vis));
memset(mp,,sizeof(mp));
memset(path,,sizeof(path));
} int _find(int x){//并查集查找祖先
return fa[x]==x ? x : fa[x] = _find(fa[x]);
} void mergeNode(int x,int y){//合并不属于同一个连通分量的两个点
int tx = _find(x),ty = _find(y);
if(tx != ty){
fa[tx] = ty;
}
} bool isLinked(int x,int y){//判断两个点是不是属于同一个连通分量
if(_find(x)!=_find(y)){
return false;
}
return true;
} void DFS(int now, int MX){
if(now==d){//搜索到d就输出;路径
cnt++;
printf("");
for(int i=; i<MX; i++){
printf(" %d",path[i]);
}
printf("\n");
}else{
//cout<<now<<endl;
for(int i=; i<idx; i++){
int u = lk[i];
if(!vis[u] && mp[now][u]){
vis[u] = true;
path[MX] = u;//这里其实没必要另开一个数组保存路径,在下一个循环的时候当前的路径已经输出或没用了
DFS(u,MX+);
vis[u] = false;
}
}
}
} void check(){
for(int i=; i<idx; i++){
printf("%d ",lk[i]);
}
printf("\n");
} int main(){
//FRE();
int kase=;
while(scanf("%d",&d)!=EOF){
int st,en;
init();
while(scanf("%d%d",&st,&en)&&st){
mp[st][en] = ;
mp[en][st] = ;
mergeNode(st,en);
}
printf("CASE %d:\n",++kase);
if(isLinked(,d)==false){
printf("There are 0 routes from the firestation to streetcorner %d.\n",d);
}else{
idx=;
for(int i=; i<maxn; i++){//找到与d在同一个连通分量里边的点并保存
if(isLinked(i, d)){
lk[idx++] = i;
}
}
sort(lk,lk+idx);//从小到大排序,保证字典序
//check();
cnt = ;
DFS(, );
printf("There are %d routes from the firestation to streetcorner %d.\n",cnt,d);
}
}
return ;
}

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. XML解析方式汇总

    XML解析方式汇总 分类: XML2011-08-23 19:19 167人阅读 评论(0) 收藏 举报 xmlstringexceptionattributesclassiterator DOM解析 ...

  2. 【CSU 1803】2016

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1803 Solution: 考虑两个数x,y乘积%2016=0 x×y≡0(MOD 2016) x= ...

  3. GCD总结(一)

    GCD为我们提供了三种类型的调度队列(dispatch queue),分别为串行,并行和主调度队列. 串行(Serial)     你可以创建任意个数的串行队列,每个队列依次执行添加的任务,一个队列同 ...

  4. 杂项-Java:Ehcache

    ylbtech-杂项-Java:Ehcache EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. 1.返回顶部 1. 基 ...

  5. JeePlus:代码生成器-生成示例(操作)

    ylbtech-JeePlus:代码生成器-生成示例(操作) 1.返回顶部 1. 生成示例由以下部分组成 单表 主附表 树表 富文本 图片管理 自定义树组件 自定义Grid 多对多 左树右表 2. 2 ...

  6. Connection: close和Connection: keep-alive有什么区别?

    看到有人问Connection: close和Connection: keep-alive有什么区别?想起以前学习到的一篇文章,今天转载来,大家看看,我也再温故知新下.如果有问题补充的在下面可以扩充下 ...

  7. [Swift通天遁地]一、超级工具-(12)使用Toaster制作简短提示语的吐司窗口

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  8. CentOS 6.5克隆后eth1与eth0的问题

    CentOS 6.5克隆后eth1与eth0的问题   按照安装文档执行以下步骤时:   从克隆出来的虚拟机网卡都会被命名为eth1,而有些程序或者脚本,涉及到网卡的,默认写的是eth0,这时就存在要 ...

  9. Asp.Net 开发实战技术

    1.什么是WMI技术 WMI是一项核心的Windows管理技术,WMI作为一种规范和基础结构,通过它可以访问.配置.管理和监视几乎所有的Windows资源,比如用户可以在远程计算机器上启动一个进程:设 ...

  10. 402 Remove K Digits 移掉K位数字

    给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小.注意:    num 的长度小于 10002 且 ≥ k.    num 不会包含任何前导零.示例 1 :输入: ...