迷宫城堡——Tarjan
传送门HDU1269
描述
为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间。Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间i。
输入
输入包含多组数据,输入的第一行有两个数:N和M,接下来的M行每行有两个数a和b,表示了一条通道可以从A房间来到B房间。文件最后以两个0结束。
输出
对于输入的每组数据,如果任意两个房间都是相互连接的,输出”Yes”,否则输出”No”。
样例
- Input
3 3
1 2
2 3
3 1
3 3
1 2
2 3
3 2
0 0
- Output
Yes
No
题解
- 判断所给有向图是否强联通
- Tarjan可以找出所有强联通分量并进行分类。
- 此算法通过dfs实现:
- 用dfn[i]来表示i节点第一次被搜索到的时间戳
- 用low[i]表示i点和i的子孙节点能追溯到的dfn的最小值
- 用栈sta来存放当前 可能 构成强联通分量的点
- 用vis[i]来记录点i当前是否在栈sta中
- 通过链式前向星遍历节点
- 初始化dfn[i]=low[i]=被dfs到的次序
- 将点i存入sta中,vis[i]=true
- 如果i在sta中,且后面遍历到的某点j能够到达i的话,那么i~j属于同一个联通分量
- 遍历i能到的每一个点j,如果dfn[j]=0,即未被访问过,则对j进行dfs,然后low[i]=min(low[i],low[j])
- 如果j能到达的下一个点i已经在sta中,则说明i~j属于同一个联通分量,那么low[j]=min(low[j],dfn[i]),在回溯的过程中,low[i~j]都会变成min(low[j]),这样就能找到强联通分量的根
- 如果dfn[i]==low[i],则说明i和他的子孙节点可构成一个联通分量,其子孙节点存放于sta中,将这些节点弹出并进行染色标记
- 最后,同一个染色标记的所有节点为同一个强联通分量,可将他们看作一个点,即缩点操作,这些强联通分量间构成一个有向无环图。
- 时间复杂度O(n+m)
Code
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
#include<bits/stdc++.h>#define INIT(a,b) memset(a,b,sizeof(a))#define LL long longusing namespace std;const int inf=0x3f3f3f3f;const int maxn=1e4+7;const int maxm=1e5+7;const int mod=1e9+7;struct Edge{ int from,to,next;}edge[maxm];int Begin[maxn],dfn[maxn],low[maxn],vis[maxn],sta[maxn],color[maxn];int n,m,tot,top,dfsNum,colNum; void init(){ INIT(Begin,-1);INIT(vis,0); INIT(low,0);INIT(dfn,0); INIT(color,0); top=-1,tot=0,dfsNum=0,colNum=0;}void add(int x,int y){ edge[tot]=(Edge){x,y,Begin[x]}; Begin[x]=tot++;}void Tarjan(int x){ dfn[x]=low[x]=++dfsNum; //标记时间戳 vis[x]=1; sta[++top]=x; //入栈 for(int i=Begin[x];~i;i=edge[i].next){ int ne=edge[i].to; if(!dfn[ne]){ Tarjan(ne); low[x]=min(low[x],low[ne]); } else if(vis[ne]) low[x]=min(low[x],dfn[ne]); //找到环 } if(low[x]==dfn[x]){ vis[x]=0; color[x]=++colNum; //出栈并染色 while(sta[top]!=x){ vis[sta[top]]=0; color[sta[top--]]=colNum; } top--;//弹出x }}int main(){ int x,y; while(~scanf("%d%d",&n,&m)&&(n||m)){ init(); while(m--){ scanf("%d%d",&x,&y); add(x,y); } for(int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i); if(colNum==1) printf("Yes\n"); else printf("No\n"); } return 0;} |
迷宫城堡——Tarjan相关推荐
- 【HDU 1269】迷宫城堡 (Tarjan算法)
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 【HDU - 1269】迷宫城堡 (tarjan算法模板)
题干: 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只 ...
- HDU1269 迷宫城堡(模板题)
HDU1269 迷宫城堡 文章目录 Problem Description 题解: Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N< ...
- HDU 1269 迷宫城堡(强连通图的判定)
最近<算法导论>快看完图论部分了,很多有关图的算法都彻底搞懂并加以证明了.现在主要是将理解的思想用到题目中来加强下.这个题目主要是判断一下整个图是否是强连通的,很简单,可以用tarjan也 ...
- HDOJ1269(迷宫城堡)
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 1269 迷宫城堡 -- 强连通图判断
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1269 图的强连通分量 http://baike.baidu.com/link?url=NqsmNsGC ...
- Hdu 1269.迷宫城堡
Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若 ...
- 迷宫城堡(HDU-1269)
Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若 ...
- Java实现迷宫城堡(强连通图的判定)
1 问题描述 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单 ...
最新文章
- ​阿里达摩院金榕:从技术到科学,中国 AI 将何去何从?
- [转载]签名、加密、证书的基本原理和理解
- Redis实现求交集操作结果缓存的设计方案
- javascript 漂亮随机码
- 使用vmstat和iostat命令进行Linux性能监控
- JavaScript学习总结(9)——JS常用函数(一)
- CIKM'21「eBay」推荐系统--利用超图对商品的多模态信息建模
- 我一个月2000多元钱退休工资,可以完成自驾游全国的心愿吗?
- 专访1药网董事长于刚:若没刘峻岭 就没我后面创业的精彩
- 利用正则表达式 替换字符串中多个 URL
- bos 获取数据库连接_bos数据库表
- windows7/windows server 2008 r2升级至sp1
- 80C51单片机的四组IO口
- asp毕业设计——基于asp+sqlserver的英语网络考试系统设计与实现(毕业论文+程序源码)——网络考试系统
- 八哥英语词根词缀汇总
- VUE不同路由地址跳转相同页面,页面数据根据不同参数刷新
- 面向对象三大基本特性
- [转]浅谈缓冲区溢出之栈溢出
- 华为DHCP Snooping原理及其实验配置
- 《赢在中国蓝天碧水间》观后感
热门文章
- 暗影精灵2pro重装ubuntu16.04,实现ubuntu16.04和win10双系统并存。
- CASIO fx-991es Plus科学计算器使用技巧
- 淘宝联盟:该网站还有非联盟创建的广告位,请先删除广告位
- sleep和wait的区别
- 通达信指标公式颜色代码的四种写法(COLOR/RGB)
- 品牌统一化vs多元化:美团与滴滴为何选择了不同道路?
- 温暖相伴 | “健康未来”项目携手九三学社走进玉林市乡村小学
- 2013豆瓣校园招聘研发类笔试题-B卷
- Socket入门详解
- python多线程爬取某网站全部h漫画_Python多线程爬虫爬取网页图片