tarjan求强连通分量模板
什么是强连通分量?
百度百科
有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected components)。
实际上构成一个环的节点都可以叫做强连通分量,特别的单独的一个节点也可以叫做强连通分量
怎么实现tarjan?
tarjan算法中的数组
dfn(遍历的编号数组) low(遍历的最小的父节点) vis(记录数组) color(染色数组) stack(栈)
具体做法(dfs)
①把节点放入栈并且初始化dfn和low相等等于当前的节点,使vis记录这个节点
②遍历当前节点的临近节点并判断
(1)如果这个节点并没有被遍历过,dfs这个节点在回溯的时候设置求low数组
公式:low[n]=min(low[n],low[p])其中n是传入的形参,p是临近的节点
(2)如果这个节点被遍历过了,但是还没来得及入栈,那么计算一下low数组
③染色
(1)如果最终一个节点的dfn和low是一样的话,那么说明这个节点可以成为是一个强连通的头节点
(2)去除栈帧,把每个头结点上的栈都染成相同的颜色。
(3)注意这个时候需要去除vis标记
(4)注意如果栈到了n这个节点也得把这个节点提出栈才可以
代码
#include <bits/stdc++.h>
using namespace std;
map<int,int> dfn,low,vis,color;
stack<int> st;
int sum,col;
vector<int> G[1005];
void tarjan(int n)
{
dfn[n]=low[n]=++sum;
vis[n]=1;
st.push(n);
for(int i=0;i<G[n].size();i++)
{
int p=G[n][i];
if(!dfn[p])
{
tarjan(p);
low[n]=min(low[n],low[p]);
}
else if(vis[p])
low[n]=min(low[n],low[p]);
}
if(low[n]==dfn[n])
{
color[n]=++col;
vis[n]=0;
while(st.top()!=n)
{
color[st.top()]=col;
vis[st.top()]=0;
st.pop();
}
st.pop();
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m;
cin>>n>>m;
while(m--)
{
int t1,t2;
cin>>t1>>t2;
G[t1].push_back(t2);
}
for(int i=1;i<=n;i++)
if(!dfn[i])
tarjan(i);
for(int i=1;i<=n;i++)
cout<<color[i]<<" ";
}
tarjan求强连通分量模板的更多相关文章
- Tarjan求强连通分量、求桥和割点模板
Tarjan 求强连通分量模板.参考博客 #include<stdio.h> #include<stack> #include<algorithm> using n ...
- tarjan求强连通分量(模板)
https://www.luogu.org/problem/P2341 #include<cstdio> #include<cstring> #include<algor ...
- tarjan求强连通分量+缩点+割点以及一些证明
“tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄> 自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...
- tarjan求强连通分量+缩点+割点/割桥(点双/边双)以及一些证明
“tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄> 自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...
- UVALive 4262——Trip Planning——————【Tarjan 求强连通分量个数】
Road Networks Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Stat ...
- UESTC 901 方老师抢银行 --Tarjan求强连通分量
思路:如果出现了一个强连通分量,那么走到这个点时一定会在强连通分量里的点全部走一遍,这样才能更大.所以我们首先用Tarjan跑一遍求出所有强连通分量,然后将强连通分量缩成点(用到栈)然后就变成了一个D ...
- Tarjan求强连通分量,缩点,割点
Tarjan算法是由美国著名计算机专家发明的,其主要特点就是可以求强连通分量和缩点·割点. 而强联通分量便是在一个图中如果有一个子图,且这个子图中所有的点都可以相互到达,这个子图便是一个强连通分量,并 ...
- HDU 1827 Summer Holiday(tarjan求强连通分量+缩点构成新图+统计入度+一点贪心思)经典缩点入门题
Summer Holiday Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- CCF 高速公路 tarjan求强连通分量
问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路. 现在,大臣们帮国王拟了一个修高速公路的 ...
随机推荐
- HDU 5073 数学题
题目传送门 http://acm.hdu.edu.cn/showproblem.php?pid=5073 这道题RE了好多发啊囧,RE到精神不振. Galaxy的质心并不是一成不变的,随着一些星球的移 ...
- navicat导入.sql文件出错2006-MySQLserver has gone away
方式一(验证无误): 找到mysql安装目录下的my.ini配置文件,加入以下代码: max_allowed_packet=500M wait_timeout=288000 interactive_t ...
- [Usaco2018 Open]Disruption
Description Farmer John自豪于他所经营的交通发达的的农场.这个农场是由N块牧场(2≤N≤50,000)组成的,N-1条双向道路将它们连接起来,每一条道路的都为一单位长度.Farm ...
- HBuilder发行原装安装包操作记录
1.在左侧"项目管理器"中选择项目: 2.点击菜单栏中的"发行-->发行为原生安装包": 3.在弹出的App云端打包中填写相关信息: IOS开发者证书配置 ...
- 因Window服务器自动更新并重启导致WebSphere服务停止服务故障一例
最近公司购买了两台Windows Server 2008 R2服务器用于提供提供Web服务,A机器安装了IHS+DM+WAS8.5集群,B机器安装了Oracle11gR2用于数据存储,两台机器均可连接 ...
- 64位linux安装wine等软件
我的系统是centos7 64位的,安装wine的时候以为和32位的一样,结果执行./configure的时候,出现错误(无法建立一个32位程序,您需要安装32位的开发库) configure: er ...
- 371 Sum of Two Integers 两整数之和
不使用运算符 + 和-,计算两整数a .b之和.示例:若 a = 1 ,b = 2,返回 3. 详见:https://leetcode.com/problems/sum-of-two-integers ...
- java https客户端请求
String pathname = Test3.class.getResource("/client.jks").getFile(); System.out.println(pat ...
- 18 C#中的循环执行 for循环
在这一节练习中,我们向大家介绍一下C#中的另一种重要的循环语句,for循环. for(表达式1;表达式2;表达式3) { 循环体 } 表达式1:一般为赋值表达式,给控制变量赋初值: 表达式2:逻辑表达 ...
- 这样的设计是否有违背MVC设计原则??
MVC 皆知为 Model-View-Controller 请求模型-〉Client发现请求-〉Controller接收+处理-〉返回Model给前端-〉前端接收处理模型Result 但是最近发现一个 ...