博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
强连通分量
阅读量:4512 次
发布时间:2019-06-08

本文共 2087 字,大约阅读时间需要 6 分钟。

Tarjan

标签(空格分隔): tarjan


kosaraju算法,comp with tarjan,复杂度差不多,写法较易,局限性较高

例题: popular cow

#include
#include
#include
#include
#include
#define INF 99999999using namespace std;int n, m, cnt;int InNum[10005];//强连通分量的节点个数bool vis[10005];//判重int FaNam[10005];//节点隶属的强连通分量的编号vector
e[10005];//正图vector
re[10005];//反图vector
s;//栈void dfs1(int x) { vis[x] = 1;//标记入栈 for(int i = 0; i < e[x].size(); i++) if(!vis[e[x][i]]) dfs1(e[x][i]);//扩展入栈节点 s.push_back(x);//入栈}void dfs2(int x) { FaNam[x] = cnt;//标记x隶属的强连通分量为cnt InNum[cnt]++;//编号为cnt的连通分量个数多一个 vis[x] = 1;//x已入强连通分量 for(int i = 0; i < re[x].size(); i++) if(!vis[re[x][i]]) dfs2(re[x][i]);//如果re[x][i]没有进入强连通分量}void Kosaraju() { memset(vis, 0, sizeof(vis)); for(int i = 1; i <= n; i++) { for(int j = 0; j < e[i].size(); j++) {//检查强连通分量的出度 int w = e[i][j]; if(FaNam[i] != FaNam[w]) vis[FaNam[i]] = 1;//设其为一 } } int ans; int t = 0; for(int i = 1; i <= cnt; i++) {//检查有几个强连通分量的出度为0 if(!vis[i]) { ans = i; t++; } } if(t == 1) //如有多个出度为零,显然不符合要求,不然就有编号为ans的强连通分量OK printf("%d\n", InNum[ans]); else printf("0\n");}int main() { int a, b; scanf("%d%d", &n, &m); for(int i = 0; i < m; i++) { scanf("%d%d", &a, &b); e[a].push_back(b); re[b].push_back(a); } for(int i = 1; i <= n; i++) if(!vis[i]) dfs1(i); memset(vis, 0, sizeof(vis)); memset(InNum, 0, sizeof(InNum)); cnt = 0; for(int i = s.size() - 1; i >= 0; i--) { if(!vis[s[i]]) { cnt++; dfs2(s[i]); } } Kosaraju(); return 0;}

tarjan算法

tarjan例图(最终版).png

| id | dfn | low |
| :--: | :-----: | :----: |
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 4 |
| 4 | 4 | 2 |
tarjan算法的中心逻辑:找环的key

术语补充

\(dfn\) : 这个节点在搜索树上
\(low\) : 这个节点隶属的强连通分量的\(key\)\(dfn\)
\(key\) : 这个强连通分量中的节点第一次被外界访问的节点,如图中强连通分量\(\{2,3,4\}\)\(key\)就是2
\(stack\) : 存储当前访问的节点(通常是一条路径或一段路径 注意区别
\(scc\) : 强连通分量

重要结论1 :

当一个节点的\(dfn = low\)时,这个节点就是它所隶属的强连通分量的\(key\),并且\(stack\)中在其后的节点全都\(\in\)它所隶属的\(scc\)

证明如下: 因为在其他的

转载于:https://www.cnblogs.com/yangxuejian/p/10759304.html

你可能感兴趣的文章
后台全选功能以及数据的提交方法
查看>>
Android 动画效果 及 自定义动画
查看>>
const与#define相比有什么不同?
查看>>
Eclipse4.7 SpringIDE插件的安装
查看>>
C#面向对象基础
查看>>
Jquery页面加载效果
查看>>
ios对new Date() 的兼容问题
查看>>
Charles常用设置
查看>>
filebeat
查看>>
如何在Bitmap中画图?(MFC)
查看>>
Windows 用来定位 DLL 的搜索路径
查看>>
Backbone 学习笔记五
查看>>
R语言:各种零碎
查看>>
Mysql5.7修改root密码
查看>>
WC2019退役失败记
查看>>
Centos6.6下安装nginx1.6.3
查看>>
iOS开发之多线程
查看>>
[算法竞赛]第七章_暴力求解法
查看>>
MorkDown 常用语法总结
查看>>
sqlserver生成随机数 2011-12-21 15:47 QQ空间
查看>>