首页 > 编程语言 >Kosaraju 算法学习笔记(求强连通分量)

Kosaraju 算法学习笔记(求强连通分量)

时间:2023-12-07 19:56:57浏览次数:36  
标签:连通 int void cnt next vis Kosaraju 求强 分量

写起来简单无比,不比 Tarjan 香?

方法

  1. 按照[1...n]的顺序在反图(边方向相反)上dfs一遍,出栈时将节点存入数组q[1...n]中
  2. 按照q[n...1]的顺序在原图上dfs一遍,每次遍历就是一个新的强联通分量

为什么是正确的?

核心在于封死连通分量往外走的路。

如果原图u-->v有一条边,且u和v不在同一个强联通分量里,那么反图v-->u有边,即u在q序列的位置一定在v的前面,那么在原图上逆序遍历q数组时一定先访问到v,再访问u,在dfs(v)时不会访问到u点(因为u和v不在同一个强联通分量里,v不能到达u),保证了算法的正确性。

核心代码

struct node{
	int v,next;
}e[2][maxn];
void insert(int T,int u,int v){
	cnt[T]++;
	e[T][cnt[T]].v=v;
	e[T][cnt[T]].next=p[T][u];
	p[T][u]=cnt[T];
}
void dfs1(int u){
	vis[u]=1;
	for(int i=p[1][u];i!=-1;i=e[1][i].next){
		int v=e[1][i].v;
		if(!vis[v]) dfs1(v);
	}
	q[++tot]=u;
}
void dfs2(int u,int RT){
	f[v]=RT;
	vis[u]=1;
	for(int i=p[0][u];i!=-1;i=e[0][i].next){
		int v=e[0][i].v;
		if(!vis[v]) dfs2(v,RT);
	}
}
void Kosaraju(){
	int n=read(),m=read();
	for(int i=1;i<=m;i++){
		int u=read(),v=read();
		insert(0,u,v);//原图 
		insert(1,v,u);//反图 
	}
	memset(vis,0,sizeof(vis));tot=0;
	for(int i=1;i<=n;i++) if(!vis[i]) dfs1(i);
	memset(vis,0,sizeof(vis));tot=0;
	for(int i=n;i>=1;i--) if(!vis[q[i]]) rt[++tot]=q[i],dfs2(q[i],tot);
}

标签:连通,int,void,cnt,next,vis,Kosaraju,求强,分量
From: https://www.cnblogs.com/yinyuqin/p/17883808.html

相关文章

  • 连通性容斥
    一种比较牛的东西,典型标志为\(n\le18\),计数满足特殊性质而且连通的状物。[ARC105F]有一张\(n\)个点\(m\)条边的简单无向图,问选出一个边集,使得\(n\)个点与这些边构成的图连通,并且图是二分图的方案数。\(1\leqn\leq17,n-1\leqm\leq\frac{n(n-1)}{2}\)。通用套路......
  • 2023-11-01:用go语言,沿街有一排连续的房屋。每间房屋内都藏有一定的现金, 现在有一位小
    2023-11-01:用go语言,沿街有一排连续的房屋。每间房屋内都藏有一定的现金,现在有一位小偷计划从这些房屋中窃取现金,由于相邻的房屋装有相互连通的防盗系统,所以小偷不会窃取相邻的房屋,小偷的窃取能力定义为他在窃取过程中能从单间房屋中窃取的最大金额,给你一个整数数组nums表示每......
  • SAP PO 接口配置1:连通WebService-通过PO调用第三方接口
    背景说明SAP通过PO中间件进行接口调用,调用外部接口。外部接口可以用任意方式生成,常见的REST类型接口即可,关于如何使用python生成接口,其他章节另述。本教程的前置条件,PO中已配置BusinessSystems,并与SAP环境连通。1.测试接口这里以常见的post接口做示例,如有其他类型接口,需......
  • 有向图求强连通分量的几种算法
    概要本文介绍了kosaraju,tarjan算法求强连通分量概念有一个有向图G,有几个概念强连通若图中有两个点u和v,他们能互相到达,则称他们强连通强连通图若是G中任意2个点都可以互相到达,则称G是一个强连通图强连通分量有向非强连通图的极大强连通子图(可以有很多个)完全......
  • 自动化ping测网络连通性监测与Excel自动记录
    根据现有提供海量ip进行检测网络质量,如果手动操作那将成为一项很难完成的操作。为了简化这一任务,可以使用Python自动化脚本,利用openpyxl和pythonping库,自动执行ping测试并记录结果到Excel文件。openpyxl:openpyxl是一个用于操作Excel文件的库。它允许你读取、写入和......
  • matlab函数_连通区域
    ​1、matlab函数bwareaopen──删除小面积对象格式:BW2=bwareaopen(BW,P,conn)作用:删除二值图像BW中面积小于P的对象,默认情况下使用8邻域。算法:(1)Determinetheconnectedcomponents. L=bwlabeln(BW,conn);(2)Computetheareaofeachcomponent. S=regionp......
  • To_Heart—总结——连通块 dp(抑或 连续块 dp)
    简介有一类问题,他们需要计算满足在序列上插入给定顺序的元素,其贡献/限制只与两旁的元素有关,但元素插入的位置是不一定的,所以会有代价的最值和方案数的统计。而对于这类问题,我们其实可以不关心每一次插入的具体位置在哪里,而只关注他的相对位置(比如在某个数左边、在某个数左边且与......
  • P5227 [AHOI2013] 连通图
    P5227[AHOI2013]连通图(膜拜并感谢@Genius_Z给予本题解思路)因为这一题是线段树合并板题,所以我们使用LCT。考虑最暴力的想法,维护一棵树和很多不在树上的边,每一次询问就暴力拆边,从那些没有被禁的边里面补到树上。这个时候我们就会发现,每次“补边”的操作非常的消耗时间。......
  • 2023-11-01:用go语言,沿街有一排连续的房屋。每间房屋内都藏有一定的现金, 现在有一位小
    2023-11-01:用go语言,沿街有一排连续的房屋。每间房屋内都藏有一定的现金,现在有一位小偷计划从这些房屋中窃取现金,由于相邻的房屋装有相互连通的防盗系统,所以小偷不会窃取相邻的房屋,小偷的窃取能力定义为他在窃取过程中能从单间房屋中窃取的最大金额,给你一个整数数组nums......
  • 2023-11-01:用go语言,沿街有一排连续的房屋。每间房屋内都藏有一定的现金, 现在有一位小
    2023-11-01:用go语言,沿街有一排连续的房屋。每间房屋内都藏有一定的现金,现在有一位小偷计划从这些房屋中窃取现金,由于相邻的房屋装有相互连通的防盗系统,所以小偷不会窃取相邻的房屋,小偷的窃取能力定义为他在窃取过程中能从单间房屋中窃取的最大金额,给你一个整数数组nums表示每......