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

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

和无向图的连通分量类似,有向图有“强连通分量”的说法。“相互可达”的关系在有向图中也是等价关系。每一个集合称为有向图的一个强连通分量(scc)。如果把一个集合看成一个点,那么所有的scc构成了一个scc图。这个scc图不会存在任何有向环,因此是一个DAG。求解有向图强连通分量的算法一般都是基于dfs的,常用的算法有Kosaraju算法和Tarjan算法,下面给出Tarjan算法的代码:

1 vector
G[maxn]; 2 int pre[maxn], low_link[maxn], scc_no[maxn], dfs_clk, scc_cnt; 3 stack
S; 4 void dfs(int u){ 5 pre[u] = low_link[u] = ++dfs_clk; 6 S.push(u); 7 FOR(i, 0, G[u].size() - 1){ 8 int v = G[u][i]; 9 if(!pre[v]){10 dfs(v);11 minimize(low_link[u], low_link[v]);12 }else if(!scc_no[v]) minimize(low_link[u], pre[v]);13 }14 if(low_link[u] == pre[u]){15 scc_cnt++;16 while(true){17 int x = S.top(); S.pop();18 scc_no[x] = scc_cnt;19 if(x == u) break;20 }21 }22 }23 void find_scc(int n){24 dfs_clk = scc_cnt = 0;25 clr(scc_no, 0), clr(pre, 0);26 FOR(i, 0, n - 1) if(!pre[i]) dfs(i);27 }

 由于每个点恰属于一个scc,因此我们希望在第一次访问某scc的结点并完成时就将该scc输出。所有需要判断某个点是否是其所在scc中最先被发现的点。与计算无向图bcc方法类似,对于每个结点$u$用$lowlink(u)$表示$u$及其后代能够追溯到最早的祖先点$v$的$pre(v)$的值。因此$u$是第一个被发现的点当且仅当$lowlink(u) =pre(u)$。

转载于:https://www.cnblogs.com/astoninfer/p/5763195.html

你可能感兴趣的文章
linux 笔记本的温度提示
查看>>
数值积分中的辛普森方法及其误差估计
查看>>
Web service (一) 原理和项目开发实战
查看>>
跑带宽度多少合适_跑步机选购跑带要多宽,你的身体早就告诉你了
查看>>
广平县北方计算机第一届PS设计大赛
查看>>
深入理解Java的接口和抽象类
查看>>
java与xml
查看>>
Javascript异步数据的同步处理方法
查看>>
iis6 zencart1.39 伪静态规则
查看>>
SQL Server代理(3/12):代理警报和操作员
查看>>
基于事件驱动的DDD领域驱动设计框架分享(附源代码)
查看>>
Linux备份ifcfg-eth0文件导致的网络故障问题
查看>>
2018年尾总结——稳中成长
查看>>
JFreeChart开发_用JFreeChart增强JSP报表的用户体验
查看>>
度量时间差
查看>>
通过jsp请求Servlet来操作HBASE
查看>>
crontab执行shell脚本日志中出现乱码
查看>>
Shell编程基础
查看>>
Shell之Sed常用用法
查看>>
3.1
查看>>