强连通图 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 : ...
- Hibernate Validator--创建自己的约束规则
尽管Bean Validation API定义了一大堆标准的约束条件, 但是肯定还是有这些约束不能满足我们需求的时候, 在这种情况下, 你可以根据你的特定的校验需求来创建自己的约束条件. 3.1. 创 ...
- play 学习 一 : 构建SBT的play项目
因为帮一个朋友做一个简单的项目,档案管理.同时也为了自己能学习PLay框架,所以记录一下. 项目GitHub地址: https://github.com/liufeiSAP/ArchiveManage ...
- mybatis---demo1--(1-n)----bai
实体类1: package com.etc.entity; import java.util.List; public class Teacher { private int tid; private ...
- js之递归拼树(树结构的数据结构)
- python unittest之断言及示例
python unintest单元测试框架提供了一整套内置的断言方法. 如果断言失败,则抛出一个AssertionError,并标识该测试为失败状态 如果异常,则当做错误来处理 注意:以上两种方式的区 ...
- eclipse安装M2Eclipse插件
作者:david_zhang@sh [转载时请以超链接形式标明文章] 链接:http://www.cnblogs.com/david-zhang-index/p/7967333.html 图1: 图2 ...
- CentOS 7 安装以及配置 VNC
一.安装VNC : yum install tigervnc tigervnc-server -y 二.启动vnc并设置密码: vncserver :1 三.将服务添加到防火墙: firewall ...
- HTML5-A*寻路算法
设置起点 设置终点 设置障碍 清除障碍 允许斜向跨越
- JAVA 框架 / SSM / SSM SPRING+SPING MVC + MYBATIS 三大框架整合详细步骤
http://how2j.cn/k/ssm/ssm-tutorial/1137.html