Kosaraju's algorithm
推荐到我的这篇博客中看完整版的。
该算法用于求解有向图的强连通分量,也就是强连通子图的个数。
算法实现摘自Kosaraju's algorithm - 百度百科:
#include <iostream>
#include <stack>
using namespace std; int map[511][511];
int nmap[511][511];
int visited[501];
stack<int> S;
int N; int DFS1(int v)
{
visited[v] = 1;
for (int i = 1; i <= N; i++)
if (!visited[i] && map[v][i])
DFS1(i);
S.push(v);
return 0;
}
int DFS2(int v)
{
visited[v] = 1;
for (int i = 1; i <= N; i++)
if (!visited[i] && nmap[v][i])
DFS2(i);
return 0;
}
int kosaraju()
{
memset(visited, 0, sizeof(visited));
for (int i = 1; i <= N; i++)
if (!visited[i]) DFS1(i);
int t = 0;
memset(visited, 0, sizeof(visited));
while (!S.empty())
{
int v = S.top();
S.pop();
printf("|%d|", v);
if (!visited[v])
{
t++;
DFS2(v);
}
}
return t;
}
int main()
{
int M, s, e;
scanf_s("%d %d", &N, &M);
memset(map, 0, sizeof(map));
memset(nmap, 0, sizeof(nmap));
for (int i = 0; i < M; i++)
{
scanf_s("%d %d", &s, &e);
map[s][e] = 1;
nmap[e][s] = 1;
}
printf("\n%d\n", kosaraju());
return 0;
}
由于这里是使用邻接矩阵表示法的Kosaraju算法,因此算法时间复杂度为 $ O(V^2) $。使用邻接链表表示法则时间复杂度为 $ O(V + E) $。其中V为顶点个数,E为边个数。
Kosaraju's algorithm的更多相关文章
- algorithm@ Strongly Connected Component
Strongly Connected Components A directed graph is strongly connected if there is a path between all ...
- Find minimum number of people to reach to spread a message across all people in twitter
Considering that I'ld would like to spread a promotion message across all people in twitter. Assumin ...
- Kosaraju 算法检测有向图的强连通性
给定一个有向图 G = (V, E) ,对于任意一对顶点 u 和 v,有 u --> v 和 v --> u,亦即,顶点 u 和 v 是互相可达的,则说明该图 G 是强连通的(Strong ...
- Kosaraju 算法查找强连通分支
有向图 G = (V, E) 的一个强连通分支(SCC:Strongly Connected Components)是一个最大的顶点集合 C,C 是 V 的子集,对于 C 中的每一对顶点 u 和 v, ...
- Kosaraju 算法
Kosaraju 算法 一.算法简介 在计算科学中,Kosaraju的算法(又称为–Sharir Kosaraju算法)是一个线性时间(linear time)算法找到的有向图的强连通分量.它利用了一 ...
- Code[VS] 1332 题解 【Kosaraju】【Tarjan】
Code[VS] 1332 上白泽慧音题解 Tarjan Algorithm Kosaraju Algorithm 题目传送门:http://codevs.cn/problem/1332/ 题目描 ...
- 【Python排序搜索基本算法】之深度优先搜索、广度优先搜索、拓扑排序、强联通&Kosaraju算法
Graph Search and Connectivity Generic Graph Search Goals 1. find everything findable 2. don't explor ...
- 强连通分量(Kosaraju)
//P2002解题思路: //先求SCC,缩点后,转换为DAG(有向无环图) //在DAG上统计入度为0的scc数量即可 //Kosaraju时间复杂度:O(N+E) //两次DFS,2N,图的转置E ...
- Kosaraju与Tarjan(图的强连通分量)
Kosaraju 这个算法是用来求解图的强连通分量的,这个是图论的一些知识,前段时间没有学,这几天在补坑... 强连通分量: 有向图中,尽可能多的若干顶点组成的子图中,这些顶点都是相互可到达的,则这些 ...
随机推荐
- 实用 SQL 语句
1. 创建 1.1 创建数据库 语法:create database db_name 示例:创建应用数据库 awesome_app sqlcreate database `awesome_app` 复 ...
- java List 排序,升序,降序
import java.util.*; public class EntrySets { public static void main(String[] args) { Map<Object, ...
- 初学Java时使用记事本开发出现的中文乱码问题
如果是使用微软记事本,那就会麻烦一点,将后缀改为.txt,用记事本打开,左上方:文件→另存为→弹出的窗口的下方会出现使用的编码形式,将编码形式修改为ANSI编码,点击保存→确定替换即可,修改后将后缀改 ...
- 每天进步一点点------Allegro 建立封装的一般步骤
在制作封装之前,先确定你需要的焊盘,如果库中没有,那就要自己画了,(我就是自己画的) 制作二极管1N5822 SMD,实际尺寸:480milX520mil 一.添加元件焊盘 1 启动Allegro P ...
- tomcat、nginx、apache、tengine都是什么,及其作用
Tomcat的功能职责:Tomcat运行在JVM之上,它和HTTP服务器一样,绑定IP地址并监听TCP端口,同时还包含以下指责: • 管理Servlet程序的生命周期• 将URL映射到指定的Ser ...
- c# excel 读写 64位操作系统 64位excel
用c#读写excel时,会出现 “本机未注册Microsoft.ACE.OLEDB.12.0 驱动(什么的,忘了)” 读写 64位的excel 时,要在项目属性里改一下目标平台,默认的为*86, 改为 ...
- jmeter的使用--添加自定义函数和导入自定义jar
1.添加自定义函数,增加 号码生成函数 MobileGenerator和身份证生成函数IdCardGenerator 在package org.apache.jmeter.functions;中增加 ...
- Linux07——安装MySQL
①检查工作 CentOS6 rpm -qa|grep mysql 或者 rpm -qa | grep mysql 如果存在mysql-libs的旧版本包如下: 一定要执行卸载呀!!! 卸载命令:rp ...
- 6_13古代象形符号(UVa1103)<图的连通块的应用>
给出一幅黑白图像,每行相邻的四个点压缩成一个十六进制的字符.然后还有题中图示的6中古老的字符,按字母表顺序输出这些字符的标号. 输出说明:For each test case, display its ...
- 虚拟函数是否应该被声明仅为private/protected?
问题导入 我想对于大家来说,虚拟函数并不能算是个陌生的概念吧.至于怎么样使用它,大部分人都会告诉我:通过在子类中重写(override)基类中的虚拟函数,就可以达到OO中的一个重要特性——多态(pol ...