Kosaraju算法+Trajan算法
先来看看什么是强连通图?
强连通图就是有向图中任意两点都能是互相可达的。
一个有向图可以分成多个子图,如果某个子图内部是强连通的,并且已经扩展到了最大,即该子图中的任意一点不与子图外的任意一点连通,则称这个子图为该有向图的一个强连通分量,简称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算法相关推荐
- 算法总结---最常用的五大算法(算法题思路)
算法总结---最常用的五大算法(算法题思路) 一.总结 一句话总结: [明确所求:dijkstra是求点到点的距离,辅助数组就是源点到目标点的数组] [最简实例分析:比如思考dijkstra:假设先只 ...
- 生成树的概念,最小生成树Prim算法 Kruskal算法
求解最小生成树可以用Prim算法 Kruskal算法
- 期望最大化算法(Expectation-Maximum,简称EM)算法+EM算法+EM的应用
期望最大化算法(Expectation-Maximum,简称EM)算法+EM算法+EM的应用 EM的应用 EM算法有很多的应用,最广泛的就是GMM混合高斯模型.聚类.HMM等等.具体可以参考Jerry ...
- 数据结构与算法:算法简介
数据结构与算法:算法简介 雪柯 大工生物信息 提笔为写给奋进之人 已关注 你说呢 . shenwei356 等 70 人赞同了该文章 引用自算法图解,作者[美] Aditya Bhargava 译袁国 ...
- 社团发现算法-BGLL算法(附代码实现)
一.社团发现算法 人们发现许多实际网络均具有社团结构, 即整个网络由若干个社团组成,社团之间的连接相对稀疏.社团内部的连接相对稠密.社团发现则是利用图拓扑结构中所蕴藏的信息从复杂网络 中解析出其模块化 ...
- javascript数据结构与算法---检索算法(二分查找法、计算重复次数)
javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...
- 【Java 虚拟机原理】垃圾回收算法 ( 标记-清除算法 | 复制算法 | 标记-整理算法 )
文章目录 总结 一.标记-清除算法 二.复制算法 三.标记-整理算法 总结 常用的垃圾回收算法 : 标记-清除算法 ; 复制算法 ; 标记-整理算法 ; 这些算法没有好坏优劣之分 , 都有各自的 优势 ...
- 【算法】双指针算法 ( 双指针算法分类 | 相向双指针 | 有效回文串 )
文章目录 一.双指针算法分类 二.相向双指针示例 ( 有效回文串 ) 一.双指针算法分类 面试时经常遇到 限制算法复杂度为 O(n)O ( n )O(n) 的情况 , 就需要使用以下算法 : 双指针算 ...
- 【计算机网络】网络层 : 路由算法 ( 路由算法分类 | 静态路由算法 | 动态路由算法 | 全局性动态路由算法 | 分散性动态路由算法 | 分层次路由选择协议 )
文章目录 一.路由算法 二.路由算法 分类 三.静态路由算法 四.动态路由算法 五.动态路由算法 分类 六.分层次的路由选择协议 一.路由算法 路由算法 : 选择数传输的 "最佳路由&quo ...
- 【Android 内存优化】垃圾回收算法 ( 内存优化总结 | 常见的内存泄漏场景 | GC 算法 | 标记清除算法 | 复制算法 | 标记压缩算法 )
文章目录 一. 内存优化总结 二. 常见的内存泄漏场景 三. 内存回收算法 四. 标记-清除算法 ( mark-sweep ) 五. 复制算法 六. 标记-压缩算法 一. 内存优化总结 内存泄漏原理 ...
最新文章
- apache配置解析php
- lucene6.0 查询语句设置关键字boost值
- 面试指南(二):想跳槽,这些技术点你会了吗?
- id长度 雪花算法_分布式系统中唯一ID算法之雪花算法
- PHP Mysql:时间函数
- C++ vector和set的区别
- Windows Server 2003至Windows Server 2008的迁移
- excel制作甘特图模板
- 2019年电赛H题电磁炮实录
- Excel 转置分组时如何保留没有对应数据的空组
- OSPF多区域配置【eNSP实现】
- 烤仔TVのCCW | 带宽不可能三角(上)
- java玩hypixel_著名服务器Hypixel入驻《我的世界》中国版
- 腾讯云硬盘挂载宝塔命令
- C++学习日记7——容器
- 磨皮美白搞笑图片处理
- 转杨毅:火箭——自助者天助
- 圆周率一千万亿位_圆周率计算已经达到数万亿位,为何还在继续计算?
- VMLogin 配置高手进阶尽在 vmlogin.cc
- EPS行业-预发机的WinFrom控制软件