强连通图 Tarjan算法
算法学习:https://blog.csdn.net/qq_16234613/article/details/77431043
http://www.cnblogs.com/chenchengxun/p/4718698.html
题目链接:https://vjudge.net/contest/219056#problem/B
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
个人思路:就是强连通图的裸题吧,学了就能过了,上面两篇博客看了应该没什么问题了
看代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<math.h>
#include<algorithm>
#include<set>
#include<queue>
#include<map>
typedef long long ll;
using namespace std;
const ll mod=1e9+;
const int maxn=1e4+;
const int maxk=+;
const int maxx=1e4+;
const ll maxe=+;
#define INF 0x3f3f3f3f3f3f
int n,m,time=,top,sum,block;
int dfn[maxn],low[maxn];//dfn存储到该点的时间,low存储从该点能到达的最小序号
int Stack[maxn];//自定义栈
int instack[maxn];//instack判断是否入栈
vector<int> G[maxn];
void init()
{
memset(instack,,sizeof(instack));
memset(Stack,,sizeof(Stack));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
for(int i=;i<=n;i++)
G[i].clear();
}
void solve(int u)
{
low[u]=dfn[u]=time++;//初始化为到该点的时间
Stack[top++]=u;//把u入栈
instack[u]=;//标记已经入栈
int v;
for(int i=;i<G[u].size();i++)
{
v=G[u][i];
if(dfn[v]==)//还没有访问过
{
solve(v);
low[u]=min(low[u],low[v]);
}
else if(instack[v])//已经访问过,并且入栈
low[u]=min(low[u],low[v]);
}
if(low[u]==dfn[u])//相等时代表有环,但是Tarjan算法一个点也被看作环
{ int m=Stack[--top];
while(m!=u)
{
sum++;
m=Stack[--top];
}
sum++;//加上本身
block++;//这里是记录有多少个块,只能有一个块把所有的点都连成一个强连通图
} }
int main()
{
while(cin>>n>>m)
{
if(n==&&m==) break;
sum=;
top=;
time=;
block=;
init();
int u,v;
for(int i=;i<m;i++)
{
cin>>u>>v;
G[u].push_back(v);
}
solve();
// cout<<sum<<" "<<block<<endl;
if(block==&&sum==n)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
}
强连通图 Tarjan算法的更多相关文章
- 图之强连通、强连通图、强连通分量 Tarjan算法
原文地址:https://blog.csdn.net/qq_16234613/article/details/77431043 一.解释 在有向图G中,如果两个顶点间至少存在一条互相可达路径,称两个顶 ...
- 有向图强连通分量的Tarjan算法
有向图强连通分量的Tarjan算法 [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G ...
- Tarjan算法---强联通分量
1.基础知识 在有向图G,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大强连通子 ...
- 强连通分量的Tarjan算法
资料参考 Tarjan算法寻找有向图的强连通分量 基于强联通的tarjan算法详解 有向图强连通分量的Tarjan算法 处理SCC(强连通分量问题)的Tarjan算法 强连通分量的三种算法分析 Tar ...
- [知识点]Tarjan算法
// 此博文为迁移而来,写于2015年4月14日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vxnx.html UPD ...
- Tarjan 算法&模板
Tarjan 算法 一.算法简介 Tarjan 算法一种由Robert Tarjan提出的求解有向图强连通分量的算法,它能做到线性时间的复杂度. 我们定义: 如果两个顶点可以相互通达,则称两个顶点强连 ...
- 【小白入门向】tarjan算法+codevs1332上白泽慧音 题解报告
一.[前言]关于tarjan tarjan算法是由Robert Tarjan提出的求解有向图强连通分量的算法. 那么问题来了找蓝翔!(划掉)什么是强连通分量? 我们定义:如果两个顶点互相连通(即存在A ...
- 有向图强连通分量 Tarjan算法
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...
- TarJan 算法求解有向连通图强连通分量
[有向图强连通分量] 在有向图G中,如果两个 顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的 ...
随机推荐
- grep的用法(转)
grep参数 -c : 显示匹配的行数(就是显示有多少行匹配了): -n :显示匹配内容所在文档的行号: -i :匹配时忽略大小写: -s :错误信息不输出: -v :输出不匹配内容: -o : ...
- 微服务理论之六:ESB与SOA的关系
一.SOA和ESB一直是没有明确概念的两个缩略词 SOA----面向服务架构,实际上强调的是软件的一种架构,一种支撑软件运行的相对稳定的结构,表面含义如此,其实SOA是一种通过服务整合来解决系统集成的 ...
- 用户认证auth模块
一.auth模块 from django.contrib import auth 1 .authenticate() :验证用户输入的用户名和密码是否相同 提供了用户认证,即验证用户名以及密码是否 ...
- kafka 基础知识梳理(转载)
一.kafka 简介 kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据.这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因 ...
- CentOS7下源码安装5.6.23
清理CentOS7下的MariaDB. [root@localhost ~]#rpm -qa | gremp mariadb [root@localhost ~]# rpm -e --node ...
- IE和W3c盒模型
盒子模型是css中一个重要的概念,理解了盒子模型才能更好的排版.其实盒子模型有两种,分别是 ie 盒子模型和标准 w3c 盒子模型.他们对盒子模型的解释各不相同,先来看看我们熟知的标准盒子模型: 从上 ...
- [51nod1116]K进制下的大数
解题关键:$A\% (k - 1) = (A[0] + A[1]*k + A[2]*{k^2} + ...A[n]*{k^n})\% (k - 1) = (A[0] + A[1] + ...A[n]) ...
- vmware克隆Centos网卡修改方法
vmware克隆Centos网卡修改方法 1,查看网卡信息,获得eth编号和MAC地址 # dmesg | grep eth e1000 0000:02:00.0:eth0:(PCI:66MHz:3 ...
- MVC项目中的分页实现例子
在开发项目中,写了一个分页实现的例子,现在把源代码贴上,以供以后写代码时参考 在列表的头部,有如下显示, 这个代表一个页面显示10条记录,总共22条记录. 这个是页面底部的显示 那么如何来显示这个分页 ...
- Umbraco back office 中form显示不出来的问题
问题纠结了好久,没找到什么原因,具体就是在back office中,form显示不出来.如下: 按下F12,在chrome 的developer tools中发现如下错误 找了半天不知道原因,后来看到 ...