【学习整理】Tarjan:强连通分量+割点+割边
Tarjan求强连通分量
在一个有向图中,如果某两点间都有互相到达的路径,那么称中两个点强联通,如果任意两点都强联通,那么称这个图为强联通图;一个有向图的极大强联通子图称为强联通分量。
算法可以在
的时间内求出一个图的所有强联通分量。
表示进入结点
的时间
表示从
所能追溯到的栈中点的最早时间
如果某个点 已经在栈中则更新
否则对 进行回溯,并在回溯后更新
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
using namespace std; int n,m,tot,ind,ans;
int dfn[200005],low[200005],last[200005];
bool ins[200005];
stack<int> s;
struct hh
{
int fr,to,next;
}e[500005];
void add(int fr,int to)
{
e[++tot].to=to;e[tot].fr=fr;
e[tot].next=last[fr];
last[fr]=tot;
}
void tarjan(int now)
{
int i,j;
s.push(now);
ins[now]=true;
low[now]=dfn[now]=++dex;
for(i=last[now];i;i=e[i].next)
if(!dfn[e[i].to])
{
tarjan(e[i].to);
low[now]=min(low[now],low[e[i].to]);
}
else if(ins[e[i].to])low[now]=min(low[now],dfn[e[i].to]); if(dfn[now]==low[now])
{
cnt=0;
do
{
j=s.top();s.pop();
ins[j]=false;
cnt++;
}while(j!=now);
ans=max(ans,cnt);
}
}
int main()
{
int i,j,u,v;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
add(u,v);
}
for(i=1;i<=n;i++)
if(!dfn[i]) tarjan(i);
printf("%d",ans);
return 0;
}
Tarjan求割点
在一个无向图中,如果删掉点 后图的连通块数量增加,则称点
为图的割点。
对于搜索树上的非根结点 ,如果存在子节点
满足
,即
向上无法达到
的祖先,则
为割点。
对于搜索树上的根节点,若它的子节点数
,则
为割点。
void tarjan(int x,int fa)
{
int i,j;
dfn[x]=low[x]=++dex;
for(i=last[x];i;i=e[i].next)
{
++t[x];
if(!dfn[e[i].to])
{
tarjan(e[i].to,x);
low[x]=min(low[x],low[e[i].to]);
if(x==root&&t[x]>=2) opt[x]=true;
else if(x!=root&&low[e[i].to]>=dfn[x]) opt[x]=true;
}
else if(e[i].to!=fa) low[x]=min(low[x],dfn[e[i].to]);
}
}
Tarjan求割边
对于当前结点 ,若邻接点中存在结点
满足
,则
为割边。
void tarjan(int x,int fa)
{
int i,j;
low[x]=dfn[x]=++dex;
for(i=last[x];i;i=e[i].next)
if(e[i].to!=fa)
{
if(dfn[e[i].to]) low[x]=min(low[x],dfn[e[i].to]);
else
{
tarjan(e[i].to,x);
low[x]=min(low[x],low[e[i].to]);
if(low[e[i].to]>dfn[x]) opt[e[i].id]=true;
}
}
}
【学习整理】Tarjan:强连通分量+割点+割边的更多相关文章
- 小结:双连通分量 & 强连通分量 & 割点 & 割边
概要: 各种dfs时间戳..全是tarjan(或加上他的小伙伴)无限膜拜tarjan orzzzzzzzzz 技巧及注意: 强连通分量是有向图,双连通分量是无向图. 强连通分量找环时的决策和双连通的决 ...
- Tarjan 强连通分量 及 双联通分量(求割点,割边)
Tarjan 强连通分量 及 双联通分量(求割点,割边) 众所周知,Tarjan的三大算法分别为 (1) 有向图的强联通分量 (2) 无向图的双联通分量(求割点,桥) ...
- tarjan 强连通分量
一.强连通分量定义 有向图强连通分量在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly c ...
- tarjan强连通分量模板(pascal)
友好城市 [问题描述]小 w 生活在美丽的 Z 国. Z 国是一个有 n 个城市的大国, 城市之间有 m 条单向公路(连接城市 i. j 的公路只能从 i 连到 j). 城市 i. j 是友好城市当且 ...
- 1051: [HAOI2006]受欢迎的牛 (tarjan强连通分量+缩点)
题目大意:CodeVs2822的简单版本 传送门 $Tarjan$强连通分量+缩点,若连通块的个数等于一则输出n:若缩点后图中出度为0的点个数为1,输出对应连通块内的点数:否则输出0: 代码中注释部分 ...
- tarjan算法(割点/割边/点连通分量/边连通分量/强连通分量)
tarjan算法是在dfs生成一颗dfs树的时候按照访问顺序的先后,为每个结点分配一个时间戳,然后再用low[u]表示结点能访问到的最小时间戳 以上的各种应用都是在此拓展而来的. 割点:如果一个图去掉 ...
- Tarjan算法 (强联通分量 割点 割边)
变量解释: low 指当前节点在同一强连通分量(或环)能回溯到的dfn最小的节点 dfn 指当前节点是第几个被搜到的节点(时间戳) sta 栈 vis 是否在栈中 ans 指强连通分量的数量 top ...
- 学习笔记--Tarjan算法之割点与桥
前言 图论中联通性相关问题往往会牵扯到无向图的割点与桥或是下一篇博客会讲的强连通分量,强有力的\(Tarjan\)算法能在\(O(n)\)的时间找到割点与桥 定义 若您是第一次了解\(Tarjan\) ...
- [poj 2553]The Bottom of a Graph[Tarjan强连通分量]
题意: 求出度为0的强连通分量. 思路: 缩点 具体有两种实现: 1.遍历所有边, 边的两端点不在同一强连通分量的话, 将出发点所在强连通分量出度+1. #include <cstdio> ...
随机推荐
- Linux下php5.3编译oracle客户端
因项目需要在linux下进行php5.3的oracle客户端编译,简要介绍一下步骤及走过的弯路. 1.下载Oracle客户端程序包,其中包含OCI.OCCI和JDBC-OCI等相关文件. 1.1下载文 ...
- 谈"自驱力"
最新说明: 1.标题是为了博眼球取的,请不大家不要纠结具体薪资数字,我瞎取的 2.请注意素质,不要满口喷粪,不要搞人身攻击,尊重别人,就是尊重你自己 3.请大家就事论事,不要胡乱臆想,请站在全局的角度 ...
- C# vs MySql
MySqlHelper类 /// <summary> ///MySql操作类 /// </summary> public abstract class MySqlHelper ...
- Jquery实现ready()的源码
function bindReady(){ if ( readyBound ) return; readyBound = true; // Mozilla, Opera and webkit nigh ...
- MyEclipse自动生成hibernate实体类和配置文件攻略
步骤1:找到导航栏里面的window--showView然后输入db brower,打开数据库浏览窗口步骤2:在数据库浏览窗口里只有一个Myeclipse自带的数据库,该数据没有用,我们在空白的地方右 ...
- 解决删除域用户Exception from HRESULT: 0x80072030
解决删除域用户异常问题. System.DirectoryServices.DirectoryServicesCOMException was unhandled Message=在服务器上没有这样 ...
- 突破GFW,使用node.js
原文链接:https://cnodejs.org/topic/4f9904f9407edba21468f31e 这个也是网上搜的,亲自试过,非常好用! 镜像使用方法(三种办法任意一种都能解决问题,建议 ...
- 在linux安装mysql,并设置远程访问
1.查看系统有没有安装mysql. vpm -qa mysql 发现有删除:rpm -e mysql(rpm -e --nodeps mysql) 2.下载数据库 mysql-standard-5.0 ...
- MySQL Cluster 集群
本文转载 http://www.cnblogs.com/gomysql/p/3664783.html MySQL Cluster是一个基于NDB Cluster存储引擎的完整的分布式数据库系统.不仅仅 ...
- JavaScript基础知识整理
只整理基础知识中关键技术,旨在系统性的学习和备忘. 1.在 JScript 中 null 和 undefined 的主要区别是 null 的操作象数字 0,而 undefined 的操作象特殊值NaN ...