先来看看什么是强连通图?
强连通图就是有向图中任意两点都能是互相可达的。
一个有向图可以分成多个子图,如果某个子图内部是强连通的,并且已经扩展到了最大,即该子图中的任意一点不与子图外的任意一点连通,则称这个子图为该有向图的一个强连通分量,简称SCC。
一个常见的问题就是如果就一个有向图的SCC个数?
这两种算法都可以用来解决有向图的强连通分量的个数。

Kosaraju算法

基于DFS的拓扑排序代码:

void dfs1(int x)
{for(int i = 0; i < a[x].size(); i++){int v = a[x][i];if(!vis[v]){vis[v] = 1;dfs1(v);} }s.push_back(x);
}

例题:http://acm.hdu.edu.cn/showproblem.php?pid=1269
AC代码:

#include <bits/stdc++.h>
#define ull unsigned long long
#define ll long long
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
const int N = 10005;
const ll ds = 1e15+7;
//const double p1 = 3.141592653589793238462643383;using namespace std;int n,m;
int vis[N],sccno[N],cnt;
vector<int>a[N],b[N],s;
void dfs1(int x)
{for(int i = 0; i < a[x].size(); i++){int v = a[x][i];if(!vis[v]){vis[v] = 1;dfs1(v);} }s.push_back(x);
}void dfs2(int x)
{for(int i = 0; i < b[x].size(); i++){int v = b[x][i];if(!sccno[v]){sccno[v] = cnt;dfs2(v);}}
}void Kosaraju()
{for(int i = 1; i <= n; i++){if(!vis[i]) {vis[i] = 1;dfs1(i);}}for(int i = s.size()-1; i >= 0; i--){if(!sccno[s[i]]){sccno[s[i]] = ++cnt;dfs2(s[i]);}}
}void solve()
{cnt = 0;for(int i = 1; i <= m; i++){int u,v;scanf("%d%d",&u,&v);a[u].push_back(v);b[v].push_back(u);}Kosaraju();cnt == 1 ? puts("Yes") : puts("No");
}  int main()
{while(~scanf("%d%d",&n,&m)){if(n == 0 && m == 0) break;memset(vis,0,sizeof(vis));memset(sccno,0,sizeof(sccno));for(int i = 0; i <= n; i++) a[i].clear(),b[i].clear(); s.clear();solve();}    return 0;
}

Trajan算法

Trajan算法解决此题
AC代码:

#include <bits/stdc++.h>
#define ull unsigned long long
#define ll long long
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
const int N = 10005;
const ll ds = 1e15+7;
//const double p1 = 3.141592653589793238462643383;using namespace std;int n,m;
int vis[N],sccno[N],low[N],num[N],cnt,t,top;
vector<int>a[N];
int st[N];
void dfs(int x)
{st[top++] = x;low[x] = num[x] = ++t;for(int i = 0; i < a[x].size(); i++){int v = a[x][i];if(!num[v]){dfs(v);low[x] = min(low[v],low[x]);} else if(!sccno[v]) low[x] = min(low[x],num[v]);}if(low[x] == num[x]){cnt++;while(true){int y = st[--top];sccno[y] = cnt;if(y == x) break;}}
}void Trajan()
{for(int i = 1; i <= n; i++){if(!num[i]) {num[i] = 1;dfs(i);}}
}void solve()
{cnt = t = top = 0;for(int i = 1; i <= m; i++){int u,v;scanf("%d%d",&u,&v);a[u].push_back(v);}Trajan();cnt == 1 ? puts("Yes") : puts("No");
}  int main()
{while(~scanf("%d%d",&n,&m)){if(n == 0 && m == 0) break;memset(low,0,sizeof(low));memset(num,0,sizeof(num));memset(sccno,0,sizeof(sccno));for(int i = 0; i <= n; i++) a[i].clear(); solve();}    return 0;
}

Kosaraju算法+Trajan算法相关推荐

  1. 算法总结---最常用的五大算法(算法题思路)

    算法总结---最常用的五大算法(算法题思路) 一.总结 一句话总结: [明确所求:dijkstra是求点到点的距离,辅助数组就是源点到目标点的数组] [最简实例分析:比如思考dijkstra:假设先只 ...

  2. 生成树的概念,最小生成树Prim算法 Kruskal算法

    求解最小生成树可以用Prim算法 Kruskal算法

  3. 期望最大化算法(Expectation-Maximum,简称EM)算法+EM算法+EM的应用

    期望最大化算法(Expectation-Maximum,简称EM)算法+EM算法+EM的应用 EM的应用 EM算法有很多的应用,最广泛的就是GMM混合高斯模型.聚类.HMM等等.具体可以参考Jerry ...

  4. 数据结构与算法:算法简介

    数据结构与算法:算法简介 雪柯 大工生物信息 提笔为写给奋进之人 已关注 你说呢 . shenwei356 等 70 人赞同了该文章 引用自算法图解,作者[美] Aditya Bhargava 译袁国 ...

  5. 社团发现算法-BGLL算法(附代码实现)

    一.社团发现算法 人们发现许多实际网络均具有社团结构, 即整个网络由若干个社团组成,社团之间的连接相对稀疏.社团内部的连接相对稠密.社团发现则是利用图拓扑结构中所蕴藏的信息从复杂网络 中解析出其模块化 ...

  6. javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...

  7. 【Java 虚拟机原理】垃圾回收算法 ( 标记-清除算法 | 复制算法 | 标记-整理算法 )

    文章目录 总结 一.标记-清除算法 二.复制算法 三.标记-整理算法 总结 常用的垃圾回收算法 : 标记-清除算法 ; 复制算法 ; 标记-整理算法 ; 这些算法没有好坏优劣之分 , 都有各自的 优势 ...

  8. 【算法】双指针算法 ( 双指针算法分类 | 相向双指针 | 有效回文串 )

    文章目录 一.双指针算法分类 二.相向双指针示例 ( 有效回文串 ) 一.双指针算法分类 面试时经常遇到 限制算法复杂度为 O(n)O ( n )O(n) 的情况 , 就需要使用以下算法 : 双指针算 ...

  9. 【计算机网络】网络层 : 路由算法 ( 路由算法分类 | 静态路由算法 | 动态路由算法 | 全局性动态路由算法 | 分散性动态路由算法 | 分层次路由选择协议 )

    文章目录 一.路由算法 二.路由算法 分类 三.静态路由算法 四.动态路由算法 五.动态路由算法 分类 六.分层次的路由选择协议 一.路由算法 路由算法 : 选择数传输的 "最佳路由&quo ...

  10. 【Android 内存优化】垃圾回收算法 ( 内存优化总结 | 常见的内存泄漏场景 | GC 算法 | 标记清除算法 | 复制算法 | 标记压缩算法 )

    文章目录 一. 内存优化总结 二. 常见的内存泄漏场景 三. 内存回收算法 四. 标记-清除算法 ( mark-sweep ) 五. 复制算法 六. 标记-压缩算法 一. 内存优化总结 内存泄漏原理 ...

最新文章

  1. apache配置解析php
  2. lucene6.0 查询语句设置关键字boost值
  3. 面试指南(二):想跳槽,这些技术点你会了吗?
  4. id长度 雪花算法_分布式系统中唯一ID算法之雪花算法
  5. PHP Mysql:时间函数
  6. C++ vector和set的区别
  7. Windows Server 2003至Windows Server 2008的迁移
  8. excel制作甘特图模板
  9. 2019年电赛H题电磁炮实录
  10. Excel 转置分组时如何保留没有对应数据的空组
  11. OSPF多区域配置【eNSP实现】
  12. 烤仔TVのCCW | 带宽不可能三角(上)
  13. java玩hypixel_著名服务器Hypixel入驻《我的世界》中国版
  14. 腾讯云硬盘挂载宝塔命令
  15. C++学习日记7——容器
  16. 磨皮美白搞笑图片处理
  17. 转杨毅:火箭——自助者天助
  18. 圆周率一千万亿位_圆周率计算已经达到数万亿位,为何还在继续计算?
  19. VMLogin 配置高手进阶尽在 vmlogin.cc
  20. EPS行业-预发机的WinFrom控制软件

热门文章

  1. unity识别图片颜色并把颜色数量排序
  2. 中国美女黑客攻击4G网络?详解
  3. 浅谈数据指标以及指标体系
  4. 人工智能学习:CS188
  5. 码农与真正程序员的区别
  6. RISC_V芯片架构
  7. 微信公共号开发教程java版——基础知识和环境搭建(一)
  8. android炫彩跑马灯特效,盘点一下那些自带酷炫跑马灯效果的手机,最后一款几乎没人知道...
  9. 软件工程标准与软件文档
  10. rgb转hsi matlab,Matlab实现HSI与RGB转换 | 学步园