Tarjan-求强连通分量
知识点-Tarjan
强连通分量:在一个图的子图中,任意两个点相互可达,也就是存在互通的路径,那么这个子图就是强连通分量(或者称为强连通分支)。如果一个有向图的任意两个点相互可达,那么这个图就称为强连通图。
当我们实现基于dfs的Tarjan算法时,我们用D[i]记录节点i被访问的时间(别的博客用dfn[i]),用F[i]记录节点i或i的子树最小可以返回到的节点j的D[j](别的博客用low[i])。
让我们模拟一下dfs的过程,每个节点上左边的是D的值,右边的是F的值。

首先从节点1开始往下深搜,每次搜索都更新D值和F值,此时F值是节点本身。

当搜索到节点4时,已经无法继续搜索。而此时D值=F值,所以我们可以判定一个强连通分量(在代码中,需要借助“栈”来寻找强连通分量中所有节点),这个强连通量就是节点4。
从图我们也可以看出,节点4无法到达其它任意节点。

从节点4返回至3,此时节点3也无路可走了。而D值=F值,那么又可以判定一个强连通分量节点3。

从3返回至2,节点2还有一条路可走!深搜节点5,修改其D值和F值。

节点5有路通向节点1,发现节点1的值已经被修改过了的!节点5的F值要修改成1,也就是它到达D值最远的节点是1。修改完后无需继续深搜节点1否则会造成死循环!而D值不等于F值,所以返回。

修改节点2的F值后,再返回。

从节点2返回至1,还有一条路通往节点6。深搜节点6并修改6的D值和F值。

节点6有路通向节点5,发现节点5的值已经被修改过!于是修改节点6的F值后返回至节点1。

当返回到节点1时,已经无路可走,D值等于F值,所以又一个强连通分量出来了……
以上的过程都可以用代码来实现。要注意F值的修改:
如果节点i的子节点j的值没有被修改,那么F[i]=min(F[i],F[j]);
否则F[i]=min(F[i],D[j]);
例题
题目描述
求强连通分量……
输入
第一行两个整数,n,m,代表点数及边数。
第2行至m+1行,每行两个整数,a,b,代表有向边的起点和终点。
输出
样例输入
6 8
1 2
2 3
3 6
5 6
2 5
5 1
1 4
4 5
样例输出
6
3
2 5 4 1
代码
#include<cstdio>
#include<algorithm>
using namespace std;
struct point{
int nxt,to;
}edge[];
int d[],f[],stack[],head[]={};
bool vis[];
int tol,cnt,n,m,a,b,index;
void add(int u,int v)
{
edge[++cnt].to=v;
edge[cnt].nxt=head[u];
head[u]=cnt;
}
int tarjan(int node)
{
tol++;
d[node]=f[node]=tol;
stack[++index]=node;
vis[node]=;
for(int i=head[node];i!=;i=edge[i].nxt)
{
if(!d[edge[i].to])
{
tarjan(edge[i].to);
f[node]=min(f[edge[i].to],f[node]);
}
else if(vis[edge[i].to])
f[node]=min(d[edge[i].to],f[node]);
}
if(d[node]==f[node])
{
do
{
printf("%d",stack[index]);
if(node!=stack[index])printf(" ");
vis[stack[index]]=;
index--;
}while(node!=stack[index+]);
printf("\n");
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d%d",&a,&b);
add(a,b);
}
for(int i=;i<=n;i++)
if(!d[i])tarjan(i);
return ;
}
Tarjan-求强连通分量的更多相关文章
- UESTC 901 方老师抢银行 --Tarjan求强连通分量
思路:如果出现了一个强连通分量,那么走到这个点时一定会在强连通分量里的点全部走一遍,这样才能更大.所以我们首先用Tarjan跑一遍求出所有强连通分量,然后将强连通分量缩成点(用到栈)然后就变成了一个D ...
- tarjan求强连通分量+缩点+割点以及一些证明
“tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄> 自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...
- Tarjan求强连通分量,缩点,割点
Tarjan算法是由美国著名计算机专家发明的,其主要特点就是可以求强连通分量和缩点·割点. 而强联通分量便是在一个图中如果有一个子图,且这个子图中所有的点都可以相互到达,这个子图便是一个强连通分量,并 ...
- tarjan求强连通分量+缩点+割点/割桥(点双/边双)以及一些证明
“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个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路. 现在,大臣们帮国王拟了一个修高速公路的 ...
- UVALive 4262——Trip Planning——————【Tarjan 求强连通分量个数】
Road Networks Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Stat ...
- tarjan求强连通分量(模板)
https://www.luogu.org/problem/P2341 #include<cstdio> #include<cstring> #include<algor ...
- Tarjan求强连通分量、求桥和割点模板
Tarjan 求强连通分量模板.参考博客 #include<stdio.h> #include<stack> #include<algorithm> using n ...
- poj 2186 tarjan求强连通分量
蕾姐讲过的例题..玩了两天后才想起来做 貌似省赛之后确实变得好懒了...再努力两天就可以去北京玩了! 顺便借这个题记录一下求强连通分量的算法 1 只需要一次dfs 依靠stack来实现的tarjan算 ...
随机推荐
- golang中的rpc包用法
RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. 我所在公司的项目是采用基于Restful的微服务架构,随着微服 ...
- Caffe学习系列(一)Ubuntu16.04下搭建编译Caffe环境,并运行MNIST示例(仅CPU)
前言: 正文: 1.安装必要依赖包: sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev l ...
- [Bnuz OJ]1176 小秋与正方形
传送门 问题描述 某天,acm的小秋拿到了一张很大很大的纸.他现在打算把它撕成正方 形.但是他没有任何工具,没有尺子,所以他尝试一种有趣的方法切分矩形.假设这是一个a*b的矩形(a>b),那么小 ...
- 大数据系列之Flume--几种不同的Sources
1.flume概念 flume是分布式的,可靠的,高可用的,用于对不同来源的大量的日志数据进行有效收集.聚集和移动,并以集中式的数据存储的系统. flume目前是apache的一个顶级项目. flum ...
- 算法模板——sap网络最大流 2(非递归+邻接表)
实现功能:同最大流 1 这里面主要是把前面的邻接矩阵改成了邻接表,相比之下速度大大提高——本人实测,当M=1000000 N=10000 时,暂且不考虑邻接矩阵会不会MLE,新的程序速度快了很多倍(我 ...
- _1_html_
创:18_3_2017修:20_3_2017什么是html? 超文本标记语言 告诉浏览器内容的语义,html中包含了各种标签html页面的框架是什么? <!DOCTYPE html> #D ...
- El表达式的用法个人总结
EL表达式的好处: 通过EL可以简化在JSP开发中对对象的引用,从而规范页面代码,增加程序的可读性及可维护性. EL表达式的几个特点: 1:可以与jsp标签库结合使用,也可以与javascript语 ...
- MyBatis极速入门开发手册(2017-2-6更新)
前言: 本篇文章对我的学习内容做一个归纳梳理,同时也记录一些学习过程中遇上的问题及注意事项等等,可以帮助新入门的朋友们消除一些误区与盲区,希望能帮上一些正在学习的朋友们.在编写时会引用一些mybati ...
- 利用python的爬虫技术爬取百度贴吧的帖子
在爬取糗事百科的段子后,我又在知乎上找了一个爬取百度贴吧帖子的实例,为了巩固提升已掌握的爬虫知识,于是我打算自己也做一个. 实现目标:1,爬取楼主所发的帖子 2,显示所爬去的楼层以及帖子题目 3,将爬 ...
- ListView的性能优化
@Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHol ...