hdu1269 有向图强连通 【Tarjan】(模板)
<题目链接>
题目大意:
Input
输入包含多组数据,输入的第一行有两个数:N和M,接下来的M行每行有两个数a和b,表示了一条通道可以从A房间来到B房间。文件最后以两个0结束。
Output
对于输入的每组数据,如果任意两个房间都是相互连接的,输出"Yes",否则输出"No"。
Sample Input
3 3
1 2
2 3
3 1
3 3
1 2
2 3
3 2
0 0
Sample Output
Yes
No 解题分析:
有向图求强连通分量的裸题,下面用的是Tarjan算法。
#include <cstdio>
#include <cstring> const int M=+;
int n,m,cnt,tot,sumlink,top;
int dfn[M],Stack[M],head[M],low[M];
bool vis[M];
struct DEGE{
int to,next;
}edge[M];
void init(){
memset(vis,,sizeof(vis));
memset(dfn,,sizeof(dfn));
memset(head,-,sizeof(head));
cnt=tot=sumlink=top=;
//cnt为edge[]中边的编号,tot为dfs遍历到的时间,sumlink为连通分量的数量,top为栈顶元素序号
}
int min(int a,int b){return a<b?a:b;}
void add(int u,int v){ //链式前向星存图
edge[++cnt].to=v,edge[cnt].next=head[u];
head[u]=cnt;
}
void Tarjan(int u){
if(sumlink>)return; //如果连通分量>1,说明不符合题意,直接结束
dfn[u]=low[u]=++tot; //dfn为遍历的序号
Stack[++top]=u;//入栈
vis[u]=true; //标记该点在栈里
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].to;
if(!dfn[v]){//如果这个点没有遍历过
Tarjan(v);
low[u]=min(low[u],low[v]);//将每个点的low值与根节点的low[]值相同
}
else if(vis[v])low[u]=min(low[u],dfn[v]);
//如果这个点在栈中,即这个联通块产生A->B->C->A的时候,那么这些元素相互可达,就将它们的low[]值置为根的dfn值(该连通块最先到达的点,即此处的dfn[])
}
if(dfn[u]==low[u]){//如果找到了这个连通分量的根节点
sumlink++;//连通分量数量+1
while(true){ //根据上面连通块的遍历过程来看,连通块中的所有点,必然在栈中是一块连续区域
int temp=Stack[top];
vis[temp]=false; //temp出栈,去除在栈内的标记
--top; //将该连通块在栈中的点排出
if(temp==u)break;//将该连通块中的根节点搜索完后(根节点==该连通块最早被dfs到的点==该连通块在栈的最底部的点)
}
}
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF,n||m){
init();
for(int i=;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
}
for(int i=;i<=n;i++){
if(!dfn[i])
Tarjan(i);
}
if(sumlink==)printf("Yes\n");
else printf("No\n");
}
return ;
}
2018-08-16
hdu1269 有向图强连通 【Tarjan】(模板)的更多相关文章
- HDU1269(有向图缩点模板题)
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU1269 有向图强连通分量
题目大意:问一个有向图是否任意两点在两个方向上互相连通. 有向图强连通分量定义:如果一个图中的任意两点在两个方向上都互相连通,则该图为强连通图.极大强连通图为有向图的强连通分量(注意是极大,不是最大. ...
- KS求有向图强连通分量模板
#include<bits/stdc++.h> using namespace std; typedef long long ll; int n,m; ; *maxn; struct no ...
- 有向图强连通分量的Tarjan算法及模板
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强联通(strongly connected),如果有向图G的每两个顶点都强联通,称有向图G是一个强联通图.非强联通图有向 ...
- 图的连通性:有向图强连通分量-Tarjan算法
参考资料:http://blog.csdn.net/lezg_bkbj/article/details/11538359 上面的资料,把强连通讲的很好很清楚,值得学习. 在一个有向图G中,若两顶点间至 ...
- hdu1269(有向图强连通分量)
hdu1269 题意 判断对于任意两点是否都可以互相到达(判断有向图强连通分量个数是否为 1 ). 分析 Tarjan 算法实现. code #include<bits/stdc++.h> ...
- 有向图强连通分量的Tarjan算法
有向图强连通分量的Tarjan算法 [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G ...
- 有向图强连通分量 Tarjan算法
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...
- 【转】有向图强连通分量的Tarjan算法
原文地址:https://www.byvoid.com/blog/scc-tarjan/ [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly con ...
随机推荐
- luogu P1070 道路游戏
传送门 这里设\(f_i\)表示时刻\(i\)的答案 转移的话在\([i-p+1,i-1]\)之间枚举j,然后考虑从哪个点走过来 复杂度为\(O(n^3)\) // luogu-judger-enab ...
- maven配置jdk1.8环境
<!-- 局部jdk配置,pom.xml中 --> <build> <plugins> <plugin> <groupId>org.apac ...
- Mask RCNN 学习笔记
下面会介绍基于ResNet50的Mask RCNN网络,其中会涉及到RPN.FPN.ROIAlign以及分类.回归使用的损失函数等 介绍时所采用的MaskRCNN源码(python版本)来源于GitH ...
- linux查看操作系统的版本
内核信息 uname -a localhost.localdomain:所在主机的主机名,与主机配置文件/etc/hosts内容一致 2.4.20-8#1:内核版本号 Thu Mar 13 17:18 ...
- 实现Servlet容器一
本文是阅读<深度解析Tomcat>的笔记. 源码:http://www.brainysoftware.com/source/9780975212806.zip├── src│ └── ...
- Debian ifconfig 命令找不到
如何配置让 Debian 非特权用户也可以使用 ifconfig . ifconfig 在 /sbin 目录下,新建一个用户时, Debian 默认从 /etc/skel/ 复制配置文件, /sbin ...
- ppt 制作圆角三角形
制作圆角三角形: PART 01 :插入三角形与三个等大的圆形: PART 02 :利用[任意多边形]和[合并形状-剪除]获得缺三角: (先选中大三角形,然后再选中任意多边形,"格式&quo ...
- Linux分区设置
基本3个就可以了 序号 路径 大小 格式 ① /boot 200MB ext4 ② 物理内存*1-1.5 swap ③ / 剩余存储空间 ext4
- ROC,AUC,PR,AP介绍及python绘制
这里介绍一下如题所述的四个概念以及相应的使用python绘制曲线: 参考博客:http://kubicode.me/2016/09/19/Machine%20Learning/AUC-Calculat ...
- linux内核中链表代码分析---list.h头文件分析(二)【转】
转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...