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

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

  算法实现摘自Kosaraju's algorithm - 百度百科:

  1. #include <iostream>
  2. #include <stack>
  3. using namespace std;
  4.  
  5. int map[511][511];
  6. int nmap[511][511];
  7. int visited[501];
  8. stack<int> S;
  9. int N;
  10.  
  11. int DFS1(int v)
  12. {
  13. visited[v] = 1;
  14. for (int i = 1; i <= N; i++)
  15. if (!visited[i] && map[v][i])
  16. DFS1(i);
  17. S.push(v);
  18. return 0;
  19. }
  20. int DFS2(int v)
  21. {
  22. visited[v] = 1;
  23. for (int i = 1; i <= N; i++)
  24. if (!visited[i] && nmap[v][i])
  25. DFS2(i);
  26. return 0;
  27. }
  28. int kosaraju()
  29. {
  30. memset(visited, 0, sizeof(visited));
  31. for (int i = 1; i <= N; i++)
  32. if (!visited[i]) DFS1(i);
  33. int t = 0;
  34. memset(visited, 0, sizeof(visited));
  35. while (!S.empty())
  36. {
  37. int v = S.top();
  38. S.pop();
  39. printf("|%d|", v);
  40. if (!visited[v])
  41. {
  42. t++;
  43. DFS2(v);
  44. }
  45. }
  46. return t;
  47. }
  48. int main()
  49. {
  50. int M, s, e;
  51. scanf_s("%d %d", &N, &M);
  52. memset(map, 0, sizeof(map));
  53. memset(nmap, 0, sizeof(nmap));
  54. for (int i = 0; i < M; i++)
  55. {
  56. scanf_s("%d %d", &s, &e);
  57. map[s][e] = 1;
  58. nmap[e][s] = 1;
  59. }
  60. printf("\n%d\n", kosaraju());
  61. return 0;
  62. }

  由于这里是使用邻接矩阵表示法的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. sendmail邮件服务器

    安装sendmail之前 我们要先搭建一个DNS服务器用来解析邮件 下图是配置好的DNS正向解析记录和反向解析记录 正向 反向 DNS配置好之后我们就来安装sendmail服务 然后再安装sendma ...

  2. springboot11(springboot-redis)

    一.Redis集群简介 1.RedisCluster概念 Redis的分布式解决方案,在3.0版本后推出的方案,有效地解决了Redis分布式的需求,当一个服务宕机可以快速的切换到另外一个服务.redi ...

  3. STM32F103之定时器学习记录

    /==============翻译STM32F103开发手册定时器部分========================/ 14 高级控制计时器(TIM1和TIM8) 14.1 TIM1和TIM8介绍 ...

  4. pytorch怎么入门学习

    pytorch怎么入门学习 https://www.zhihu.com/question/55720139

  5. Pikachu练习平台(暴力破解)

    Pikachu练习平台(暴力破解) 因为下面要用到burp suite,这里先简单介绍一下intruder模块的东西 Target选项:        设置攻击目标,可以通过proxy发送 Pasit ...

  6. mockito使用教程

    一.什么是 Mock 测试 Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取比较复杂的对象(如 J ...

  7. UVA 1267 Network(DFS)

    题目链接:https://vjudge.net/problem/UVA-1267 首先我们要把这样一棵无根树转换成有根树,那么树根我们可以直接使用$VOD$. 还有一个性质:如果深度为$d$的一个节点 ...

  8. maven基础学习篇

    一.Maven的两大核心功能:依赖管理(主要是jar包的管理)  和   一键构建 1.依赖管理:maven项目所需要的jar包全部放在仓库中,项目只放置jar包的坐标,所要用到的jar包都从仓库中获 ...

  9. IntelliJ IDEA 2017.3尚硅谷-----界面展示

  10. 转 C#中哈希表(HashTable)的用法详解

    看了一遍有关哈希表的文字,作者总结的真是不错 .收藏起来 1.  哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提 ...