推荐到我的这篇博客中看完整版的。

  该算法用于求解有向图的强连通分量,也就是强连通子图的个数。

  算法实现摘自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的更多相关文章

  1. algorithm@ Strongly Connected Component

    Strongly Connected Components A directed graph is strongly connected if there is a path between all ...

  2. 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 ...

  3. Kosaraju 算法检测有向图的强连通性

    给定一个有向图 G = (V, E) ,对于任意一对顶点 u 和 v,有 u --> v 和 v --> u,亦即,顶点 u 和 v 是互相可达的,则说明该图 G 是强连通的(Strong ...

  4. Kosaraju 算法查找强连通分支

    有向图 G = (V, E) 的一个强连通分支(SCC:Strongly Connected Components)是一个最大的顶点集合 C,C 是 V 的子集,对于 C 中的每一对顶点 u 和 v, ...

  5. Kosaraju 算法

    Kosaraju 算法 一.算法简介 在计算科学中,Kosaraju的算法(又称为–Sharir Kosaraju算法)是一个线性时间(linear time)算法找到的有向图的强连通分量.它利用了一 ...

  6. Code[VS] 1332 题解 【Kosaraju】【Tarjan】

    Code[VS] 1332 上白泽慧音题解 Tarjan Algorithm Kosaraju Algorithm 题目传送门:http://codevs.cn/problem/1332/   题目描 ...

  7. 【Python排序搜索基本算法】之深度优先搜索、广度优先搜索、拓扑排序、强联通&Kosaraju算法

    Graph Search and Connectivity Generic Graph Search Goals 1. find everything findable 2. don't explor ...

  8. 强连通分量(Kosaraju)

    //P2002解题思路: //先求SCC,缩点后,转换为DAG(有向无环图) //在DAG上统计入度为0的scc数量即可 //Kosaraju时间复杂度:O(N+E) //两次DFS,2N,图的转置E ...

  9. Kosaraju与Tarjan(图的强连通分量)

    Kosaraju 这个算法是用来求解图的强连通分量的,这个是图论的一些知识,前段时间没有学,这几天在补坑... 强连通分量: 有向图中,尽可能多的若干顶点组成的子图中,这些顶点都是相互可到达的,则这些 ...

随机推荐

  1. python3.0练习100题——001

    自学python3中,现在开始每天在python2.71 100例中做一道题,用python3实现,并写下一些思考-加油(ง •̀灬•́)ง 题目网站(http://www.runoob.com/py ...

  2. Spring Cloud Netflix Eureka【服务治理】

    一.简介 二.使用 一.源码分析

  3. 执行ifconfig eth2 up命令报错eth2: unknown interface: No such device的解决思路

    排查问题思路 一般出现这种状况都是网卡mac地址错误引起的!要么网卡配置文件中的mac地址不对,要么/etc/udev/rules.d/70-persistent-net.rules文件中的mac地址 ...

  4. drf的序列化和反序列化

    序列化器--Serializer 选项参数: max_length 最大长度 min_length 最小长度 allow_blank 是否允许为空 trim_whitespace 是否截断空白字符 m ...

  5. Flask的基本使用

    最基本的一个Flask模板,实现本地9898端口访问,页面返回hello world from flask import Flask app = Flask(__name__) @app.route( ...

  6. 【转】Chrome——F12 谷歌开发者工具详解

    Chrome——F12 谷歌开发者工具详解 console source network

  7. 题解【洛谷P2619】[国家集训队2]Tree I

    题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 第一行\(V,E,need\)分别表示点数,边 ...

  8. 【原】linux增加开机自启动脚本

    在rc.local脚本中添加开机自启动程序

  9. java判断两个时间相差得天数

    方法一:通过Calendar类得日期比较,在这需要考虑闰年和平年,也要考虑跨年份 /** * date2比date1多的天数 * @param date1 * @param date2 * @retu ...

  10. php 基础 二维数组以某个重复值累加

    $arr = array( array('id' => 123, 'name' => '张三', 'amount'=>'1'), array('id' => 123, 'nam ...