<题目链接>

题目大意:

为了训练小希的方向感,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. ZOC7 for Mac连接CentOS7无法输入中文问题

    确定是ZOC7的问题 改为 iTerm2 加 ZSH 能够输入中文了 自己配置profile 慢慢所有的终端都用iTerm2 渐渐放弃ZOC7

  2. mysql 查询优化~sql优化通用

    一 简介:今天我们来探讨下SQL语句的优化基础 二 基础规则: 一 通用: 1 避免索引字段使用函数     2 避免发生隐式转换     3 order by字段需要走索引,否则会发生filesor ...

  3. python标准库 - 数学库和随机数库

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们已经在Python运算中看到Python最基本的数学运算功能.此外,math包 ...

  4. ubuntu14.04 安装 openssh-server

    ubuntu自带的有openssh-client,所以可以通过 ssh username@host 来远程连接linux 可是要想通过ssh被连接,ubuntu系统需要有openssh-server, ...

  5. 用C++的 new 代替 C 的 malloc 进行内存分配

    例子: (int*)malloc(100*sizeof(int)) 是先取得int类型的字节宽度,然后乘100计算后得到400,然后调用malloc,并将400传递给函数,分配400字节的内存空间,但 ...

  6. oracle查看表名称和表字段注释

    --查询该表字段的注释select * from user_col_comments where Table_Name like '%SMS%' --查询类似表select * from user_t ...

  7. C:malloc/calloc/realloc/alloca内存分配函数

    原文地址:http://www.cnblogs.com/3me-linux/p/3962152.html calloc(), malloc(), realloc(), free(),alloca() ...

  8. scn 时间

    Scn转换成时间: select to_char(scn_to_timestamp(3998591352171),'YYYY-MM-DD HH24:MI:SS') from dual: 时间转换成sc ...

  9. 故障 -> nginx启动失败

    描述:在用saltstack给 minion 安装 nginx 服务 时 提示 nginx 服务下载成功,但是启动失败. ---------- ID: nginx-systemctl Function ...

  10. python操作haproxy.cfg文件

    需求 1.查 输入:www.oldboy.org 获取当前backend下的所有记录 2.新建 输入: arg = { 'bakend': 'www.oldboy.org', 'record':{ ' ...