<题目链接>

题目大意:

为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间。Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间i。 

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】(模板)的更多相关文章

  1. HDU1269(有向图缩点模板题)

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  2. HDU1269 有向图强连通分量

    题目大意:问一个有向图是否任意两点在两个方向上互相连通. 有向图强连通分量定义:如果一个图中的任意两点在两个方向上都互相连通,则该图为强连通图.极大强连通图为有向图的强连通分量(注意是极大,不是最大. ...

  3. KS求有向图强连通分量模板

    #include<bits/stdc++.h> using namespace std; typedef long long ll; int n,m; ; *maxn; struct no ...

  4. 有向图强连通分量的Tarjan算法及模板

    [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强联通(strongly connected),如果有向图G的每两个顶点都强联通,称有向图G是一个强联通图.非强联通图有向 ...

  5. 图的连通性:有向图强连通分量-Tarjan算法

    参考资料:http://blog.csdn.net/lezg_bkbj/article/details/11538359 上面的资料,把强连通讲的很好很清楚,值得学习. 在一个有向图G中,若两顶点间至 ...

  6. hdu1269(有向图强连通分量)

    hdu1269 题意 判断对于任意两点是否都可以互相到达(判断有向图强连通分量个数是否为 1 ). 分析 Tarjan 算法实现. code #include<bits/stdc++.h> ...

  7. 有向图强连通分量的Tarjan算法

    有向图强连通分量的Tarjan算法 [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G ...

  8. 有向图强连通分量 Tarjan算法

    [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...

  9. 【转】有向图强连通分量的Tarjan算法

    原文地址:https://www.byvoid.com/blog/scc-tarjan/ [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly con ...

随机推荐

  1. luogu P1070 道路游戏

    传送门 这里设\(f_i\)表示时刻\(i\)的答案 转移的话在\([i-p+1,i-1]\)之间枚举j,然后考虑从哪个点走过来 复杂度为\(O(n^3)\) // luogu-judger-enab ...

  2. maven配置jdk1.8环境

    <!-- 局部jdk配置,pom.xml中 --> <build> <plugins> <plugin> <groupId>org.apac ...

  3. Mask RCNN 学习笔记

    下面会介绍基于ResNet50的Mask RCNN网络,其中会涉及到RPN.FPN.ROIAlign以及分类.回归使用的损失函数等 介绍时所采用的MaskRCNN源码(python版本)来源于GitH ...

  4. linux查看操作系统的版本

    内核信息 uname -a localhost.localdomain:所在主机的主机名,与主机配置文件/etc/hosts内容一致 2.4.20-8#1:内核版本号 Thu Mar 13 17:18 ...

  5. 实现Servlet容器一

    本文是阅读<深度解析Tomcat>的笔记. 源码:http://www.brainysoftware.com/source/9780975212806.zip├── src│   └── ...

  6. Debian ifconfig 命令找不到

    如何配置让 Debian 非特权用户也可以使用 ifconfig . ifconfig 在 /sbin 目录下,新建一个用户时, Debian 默认从 /etc/skel/ 复制配置文件, /sbin ...

  7. ppt 制作圆角三角形

    制作圆角三角形: PART 01 :插入三角形与三个等大的圆形: PART 02 :利用[任意多边形]和[合并形状-剪除]获得缺三角: (先选中大三角形,然后再选中任意多边形,"格式&quo ...

  8. Linux分区设置

    基本3个就可以了 序号 路径 大小 格式 ① /boot 200MB ext4 ②   物理内存*1-1.5 swap ③ / 剩余存储空间 ext4

  9. ROC,AUC,PR,AP介绍及python绘制

    这里介绍一下如题所述的四个概念以及相应的使用python绘制曲线: 参考博客:http://kubicode.me/2016/09/19/Machine%20Learning/AUC-Calculat ...

  10. linux内核中链表代码分析---list.h头文件分析(二)【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...