
求解强连通分量的一种方法
发布日期:2021-05-07 05:54:10
浏览次数:27
分类:精选文章
本文共 1125 字,大约阅读时间需要 3 分钟。
如果对于任意两个不同的顶点u和v,存在一个从u到v的有向路径以及从v到u的有向路径,这样的有向图被称为是强连通的。一般来说,一个有向图的顶点可以分割成一些互不相交的最大子集,每个子集的顶点之间可以通过有向图中的有向路径相互访问,这些子集被称为强连通分量。
下面的方法来自《算法设计与分析基础》作者: Anany Levitin 译者: 潘彦下面三步说的顶点变成死端是递归的dfs出栈的顺序。
第一步:对给定的有向图执行一次DFS遍历,然后按照顶点变成死端的顺序对它们进行编号。
第二步:颠倒有向图所有边方向。 第三步:对于新的有向图,从仍未访问过的顶点中编号最大的顶点开始(而且如果有必要的话,可以重新开始)做一遍DFS遍历。邻接表
package d;public class AGraph { int n,e;VNode adjlist[];public AGraph(int n) { super(); this.n = n; adjlist=new VNode[n];}}package d;class ArcNode{ int adjvex; ArcNode nextarc;ArcNode reverse_nextarc;public ArcNode() { } public ArcNode (int adjvex){ this.adjvex=adjvex;};}package d;class VNode{ //邻接矩阵的顶点也可以用这个ArcNode firstarc;ArcNode reverse_firstarc;int Serial_number;//DFS访问后按照死端编号char info; public VNode(char info) { this.info = info;}public VNode() { super();}}
主程序
package d;import java.util.Comparator;class Mycomparator implements Comparator{ public int compare(VNode v1,VNode v2) { int a=v1.Serial_number; int b=v2.Serial_number; if (a>b) { return -1;//按照这种方式排序 } else if (a cmp=new Mycomparator(); Arrays.sort(a.adjlist,cmp); for (int i=0;i
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年04月17日 19时07分15秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Internet Explorer 10 专题上线
2021-05-09
云计算之路-阿里云上:0:25~0:40网络存储故障造成网站不能正常访问
2021-05-09
网站故障公告1:使用阿里云RDS之后一个让人欲哭无泪的下午
2021-05-09
上周热点回顾(1.21-1.27)
2021-05-09
上周热点回顾(6.3-6.9)
2021-05-09
上周热点回顾(8.12-8.18)
2021-05-09
【故障公告】升级阿里云 RDS SQL Server 实例故障经过
2021-05-09
蹒跚来迟:新版博客后台上线公测
2021-05-09
上周热点回顾(9.16-9.22)
2021-05-09
上周热点回顾(11.4-11.10)
2021-05-09
[网站公告]11月26日00:00-04:00阿里云RDS升级
2021-05-09
[网站公告]又拍云API故障造成图片无法上传(已恢复)
2021-05-09
上周热点回顾(12.16-12.22)
2021-05-09
云计算之路-阿里云上:对“黑色30秒”问题的猜想
2021-05-09
云计算之路-阿里云上:“黑色30秒”走了,“黑色1秒”来了,真相也许大白了
2021-05-09
云计算之路-阿里云上:奇怪的CPU 100%问题
2021-05-09
云计算之路-阿里云上:2014年6月12日12点IIS请求到达量突降
2021-05-09
上周热点回顾(6.9-6.15)
2021-05-09
上周热点回顾(6.16-6.22)
2021-05-09
上周热点回顾(6.23-6.29)
2021-05-09