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 这个算法是用来求解图的强连通分量的,这个是图论的一些知识,前段时间没有学,这几天在补坑... 强连通分量: 有向图中,尽可能多的若干顶点组成的子图中,这些顶点都是相互可到达的,则这些 ...
随机推荐
- sendmail邮件服务器
安装sendmail之前 我们要先搭建一个DNS服务器用来解析邮件 下图是配置好的DNS正向解析记录和反向解析记录 正向 反向 DNS配置好之后我们就来安装sendmail服务 然后再安装sendma ...
- springboot11(springboot-redis)
一.Redis集群简介 1.RedisCluster概念 Redis的分布式解决方案,在3.0版本后推出的方案,有效地解决了Redis分布式的需求,当一个服务宕机可以快速的切换到另外一个服务.redi ...
- STM32F103之定时器学习记录
/==============翻译STM32F103开发手册定时器部分========================/ 14 高级控制计时器(TIM1和TIM8) 14.1 TIM1和TIM8介绍 ...
- pytorch怎么入门学习
pytorch怎么入门学习 https://www.zhihu.com/question/55720139
- Pikachu练习平台(暴力破解)
Pikachu练习平台(暴力破解) 因为下面要用到burp suite,这里先简单介绍一下intruder模块的东西 Target选项: 设置攻击目标,可以通过proxy发送 Pasit ...
- mockito使用教程
一.什么是 Mock 测试 Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取比较复杂的对象(如 J ...
- UVA 1267 Network(DFS)
题目链接:https://vjudge.net/problem/UVA-1267 首先我们要把这样一棵无根树转换成有根树,那么树根我们可以直接使用$VOD$. 还有一个性质:如果深度为$d$的一个节点 ...
- maven基础学习篇
一.Maven的两大核心功能:依赖管理(主要是jar包的管理) 和 一键构建 1.依赖管理:maven项目所需要的jar包全部放在仓库中,项目只放置jar包的坐标,所要用到的jar包都从仓库中获 ...
- IntelliJ IDEA 2017.3尚硅谷-----界面展示
- 转 C#中哈希表(HashTable)的用法详解
看了一遍有关哈希表的文字,作者总结的真是不错 .收藏起来 1. 哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提 ...