耿老师教你学Java:图图学JGraphT开源框架第5回
创始人
2025-03-01 09:48:45
0

摘要:图图学JGraphT开源框架是教材《数据结构与算法》-java语言版(清华大学出版社-2024,耿祥义,张跃平)第13章《图论》的课外读物(共计19回25个实例),所以主要围绕教材的内容学习JGraphT开源框架,即学JGraphT开源框架最重要的部分,不是学习JGraphT开源框架的全部内容(JGraphT开源框架封装关于最短路径的算法类就有30多个)。掌握这里的这些内容,也可以让我们在实际项目更加容易地使用图论的算法,这也正是框架的目的。

图图学开源JGraphT开源框架目录如下

第1回《无向图和SimpleGraph 类》 第2回《Graph 接口》 第3回《无向图和BiconnectivityInspector 类》 第4回《有向图和SimpleDirectedGraph类》 第5回《有向图和GabowStrongConnectivityInspector类》 第6回《有向图与AllDirectedPaths类》 第7回《无向网络和SimpleWeightedGraph 类》 第8回《有向网络和SimpleDirectedWeightedGraph类》 第9回《深度优先搜索(DFS)和DepthFirstIterator类》 第10回《广度优先搜索(BFS)和BreadthFirstIterator类》 第11回《最短路径和FloydWarshallShortestPaths类》 第12回《最短路径和DijkstraShortestPath类》 第13回《最短路径和BFSShortestPath类》 第14回《第k短路径和EppsteinKShortestPath类》 第15回《最小生成树和PrimMinimumSpanningTree类》 第16回《拓扑排序和TopologicalOrderIterator类》 第17回《图着色与GreedyColoring类》 第18回《介数和Betweenness Centrality类》 第19回《最大流算法和EdmondsKarpMFImpl类》

这是

图图学开源JGraphT的第5回-《有向图和GabowStrongConnectivityInspector类》,这回学习的主要内容是:

  • 强连通有向图

  • 有向图的强连通分量

  • GabowStrongConnectivityInspector类

一、强连通有向图

二、有向图的强连通分量

有向图的极大强连通子图称为的强连通分量,一个非连通的有向图一定会有多个(不少于一个)强连通分量。任何强连通图的强连通分量只有一个,即自身。下面的图5.1中的有向图有3个连通分量。

第1个强连通分量:([3], [])

第2个强连通分量:([0, 1, 2], [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)])

第3个强连通分量:([4, 5, 6], [(4,5), (5,6), (6,4)])

三、GabowStrongConnectivityInspector

GabowStrongConnectivityInspector 类继承自 java.lang.Object,类的实例可用于检查一个有向图是否是强连通图、可用于得到非连通的有向图的全部强连通分量。算法遵循 Gabow(2000 年)在《Path-based depth-first search for strong and biconnected components》中提出的 Cheriyan - Mehlhorn/Gabow 算法。该算法的运行时间复杂度为其中 是顶点数,是边数

GabowStrongConnectivityInspector 类的常用方法:

Graph getGraph:

返回底层图。

java.util.List> getStronglyConnectedComponents:

返回图的全部强连通分量。

boolean isStronglyConnected:

如果图是强连通的,则返回 true,否则返回 false。

五、代码与效果

将jgrapht-1.5.2.zip解压后的lib文件夹复制到C:\studyJGrapht,然后在命令行进入开发目录C:\studyJGrapht。(C:\studyJGrapht是作者使用的开发目录,您可以使用任何自己喜欢的开发目录或名称)。

例子5.1 判断有向图5.1是否是强连通,并的得到强连通分量(效果如图5.2)

如下编译运行代码。

C:\studyJGrapht>javac -cplib\*;. Ex5_1.java C:\studyJGrapht>java -cplib\*;. Ex5_1

图5.2 判断有向图是否强连通

Ex5_1.java

importorg.jgrapht.Graph; importorg.jgrapht.graph.DefaultEdge; importorg.jgrapht.graph.SimpleDirectedGraph; importorg.jgrapht.alg.connectivity.GabowStrongConnectivityInspector; importjava.util.Set; importjava.util.List; public classEx5_1{ public static void main(String[] args) { // 创建一个有向图,顶点类型为Integer,边类型为 DefaultEdge Graph graph = new SimpleDirectedGraph<>(DefaultEdge.class); for(inti=0;i<7;i++) { // 添加顶点 graph.addVertex(i); } int[][]a = {{0,1,1,1,0,0,0}, {1,0,1,0,0,0,0}, {1,1,0,1,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,1,0}, {0,0,0,0,0,0,1}, {0,0,0,0,1,0,0}}; for(inti=0;i for(intj=0;j0].length;j++){ if(a[i][j]==1) { graph.addEdge(i,j); // 添加边 } } } printVertexAndEdge(graph); // 创建 ConnectivityInspector 实例 GabowStrongConnectivityInspector inspector = new GabowStrongConnectivityInspector<>(graph); // 测试图是否强连通 System.out.println("图是否强连通: "+ inspector.isStronglyConnected); // 获取图的所有强连通分量 List> stronglyConnectedComponents = inspector.getStronglyConnectedComponents; System.out.println("所有强连通分量:"); inti =1; for(Graph component : stronglyConnectedComponents) { System.out.println("第"+i+"个强连通分量:"+component); i++; } } private static void printVertexAndEdge(Graph graph){ // 打印图中的所有顶点 Set allVertex = graph.vertexSet; System.out.println("图中的顶点和边: "+ allVertex+".边:"); // 打印图中的所有边 Set allEdge = graph.edgeSet; for(DefaultEdge edge : allEdge) { Integer source = graph.getEdgeSource(edge); Integer target = graph.getEdgeTarget(edge); System.out.print(source + "->"+ target+"\t"); } System.out.println; } }

相关内容

AI赋能包 | 产品介绍⑪...
产品介绍 短视频AI剪辑与碰一碰批量发布系统是一套面向企业短视频矩...
2026-08-03 20:19:24
以AI大模型“伏羲”为基础...
台风为何经常“跑偏”?因为大气系统自带“混沌”属性,初始条件差之毫...
2026-08-02 19:37:57
开源启动盘制作工具Vent...
IT之家 7 月 25 日消息,科技媒体 Neowin 昨日(7 ...
2026-07-26 18:17:15
AI 驱动游戏生态运营效率...
导语 2026 年,AI 技术正在以前所未有的速度渗透游戏行业的各...
2026-07-25 23:12:20
从「AI误判」到「品牌正名...
国内一家同时覆盖两轮车充电与新能源直流快充的全产业链充电桩企业,凭...
2026-07-24 21:00:04
为什么说只有百度网盘能定义...
文 | 佘宗明 “时间证实一切,因为它改变一切。”沈从文在散文《时...
2026-07-23 15:34:23

热门资讯

韩国启动全民AI成长阶梯项目,... 2026年8月3日,韩国科学技术信息通信部正式启动全民AI成长阶梯项目,项目整合全民AI学习馆、全民...
从全民AI入门到创业孵化,韩国... 8月3日,财闻海外资讯消息,韩国科学技术信息通信部正式启动全民AI成长阶梯项目,整合全民AI学习馆、...
AI赋能包 | 产品介绍⑪——... 产品介绍 短视频AI剪辑与碰一碰批量发布系统是一套面向企业短视频矩阵营销的“AI剪辑+碰一碰发布”系...
PandaAI李昱琦:AI交易... 上证报中国证券网讯(记者 胡尧)8月1日,在上海虹口举行的PandaAI第三届因子大赛颁奖典礼暨AI...
真人短剧被AI“抢饭碗”?从业... “去年下半年AI短剧开始兴起,过完年真人短剧行情跌到谷底。真人短剧拍摄量锐减,大量专门承接平台真人剧...
Genspark 发布 Gen... 用 Al-Native 的方式,打造一款新时代的 Office。 8 月 3 日,在 AGI Pla...
原生统一多模态进阶!Sense... 今年4月,商汤科技发布了SenseNova U1,首次完整展示了基于NEO-Unify架构的原生统一...
开放通用智能,MiniMax ... 8月3日,据MiniMax消息,MiniMax正式开源新一代通用视频模型MiniMax H3。据介绍...
商汤科技开源多模态模型Sens... IT之家 8 月 3 日消息,商汤科技今日宣布,面向社区开源轻量级统一多模态模型的预览版本 Sens...
MiniMax开源H3,视频模... 长期封闭的视频模型赛道,出现了一个开源旗舰。 7月31日,MiniMax发布视频旗舰模型H3,并在8...