例1: 添加点、边

import java.net.*;

import org.jgrapht.*;
import org.jgrapht.graph.*; /**
* A simple introduction to using JGraphT.
*
* @author Barak Naveh
* @since Jul 27, 2003
*/
public final class HelloJGraphT
{
private HelloJGraphT()
{
} // ensure non-instantiability. /**
* The starting point for the demo.
*
* @param args ignored.
*/
public static void main(String[] args)
{
UndirectedGraph<String, DefaultEdge> stringGraph = createStringGraph(); // note undirected edges are printed as: {<v1>,<v2>}
System.out.println(stringGraph.toString()); // create a graph based on URL objects
DirectedGraph<URL, DefaultEdge> hrefGraph = createHrefGraph(); // note directed edges are printed as: (<v1>,<v2>)
System.out.println(hrefGraph.toString());
} /**
* Creates a toy directed graph based on URL objects that represents link structure.
*
* @return a graph based on URL objects.
*/
private static DirectedGraph<URL, DefaultEdge> createHrefGraph()
{
DirectedGraph<URL, DefaultEdge> g = new DefaultDirectedGraph<URL, DefaultEdge>(DefaultEdge.class); try {
URL amazon = new URL("http://www.amazon.com");
URL yahoo = new URL("http://www.yahoo.com");
URL ebay = new URL("http://www.ebay.com"); // add the vertices
g.addVertex(amazon);
g.addVertex(yahoo);
g.addVertex(ebay); // add edges to create linking structure
g.addEdge(yahoo, amazon);
g.addEdge(yahoo, ebay);
} catch (MalformedURLException e) {
e.printStackTrace();
} return g;
} /**
* Create a toy graph based on String objects.
*
* @return a graph based on String objects.
*/
private static UndirectedGraph<String, DefaultEdge> createStringGraph()
{
UndirectedGraph<String, DefaultEdge> g = new SimpleGraph<String, DefaultEdge>(DefaultEdge.class); String v1 = "v1";
String v2 = "v2";
String v3 = "v3";
String v4 = "v4"; // add the vertices
g.addVertex(v1);
g.addVertex(v2);
g.addVertex(v3);
g.addVertex(v4); // add edges to create a circuit
g.addEdge(v1, v2);
g.addEdge(v2, v3);
g.addEdge(v3, v4);
g.addEdge(v4, v1); return g;
}
}

结果

([v1, v2, v3, v4], [{v1,v2}, {v2,v3}, {v3,v4}, {v4,v1}])
([http://www.amazon.com, http://www.yahoo.com, http://www.ebay.com], [(http://www.yahoo.com,http://www.amazon.com), (http://www.yahoo.com,http://www.ebay.com)])

例2:强、弱连通

import java.util.List;
import java.util.Set; import org.jgrapht.DirectedGraph;
import org.jgrapht.alg.KosarajuStrongConnectivityInspector;
import org.jgrapht.alg.interfaces.StrongConnectivityAlgorithm;
import org.jgrapht.alg.ConnectivityInspector;
import org.jgrapht.graph.DefaultDirectedGraph;
import org.jgrapht.graph.DefaultEdge; public class GraphConnDemo
{
private DirectedGraph<String, DefaultEdge> directedGraph; public GraphConnDemo(){
directedGraph = new DefaultDirectedGraph<String, DefaultEdge>(DefaultEdge.class);
directedGraph.addVertex("a");
directedGraph.addVertex("b");
directedGraph.addVertex("c");
directedGraph.addVertex("d");
directedGraph.addVertex("e");
directedGraph.addVertex("f");
directedGraph.addVertex("h");
directedGraph.addVertex("i");
directedGraph.addEdge("a", "b");
directedGraph.addEdge("b", "c");
directedGraph.addEdge("c", "d");
directedGraph.addEdge("d", "a");
directedGraph.addEdge("c", "e");
directedGraph.addEdge("f", "h");
directedGraph.addEdge("f", "i");
} public void testStrongConn(){
StrongConnectivityAlgorithm<String, DefaultEdge> scAlg =
new KosarajuStrongConnectivityInspector<String, DefaultEdge>(directedGraph);
List<Set<String>> stronglyConnetedSet =
scAlg.stronglyConnectedSets(); System.out.println("Strongly connected components:");
for (int i = 0; i < stronglyConnetedSet.size(); i++) {
System.out.println(stronglyConnetedSet.get(i));
}
System.out.println(); }
public void testWeakConn() {
ConnectivityInspector<String, DefaultEdge> connectivityInspector = new ConnectivityInspector<String, DefaultEdge>(directedGraph);
List<Set<String>> weaklyConnectedSet = connectivityInspector.connectedSets();
System.out.println("Weakly connected components:");
for (int i = 0; i < weaklyConnectedSet.size(); i++) {
System.out.println(weaklyConnectedSet.get(i));
}
System.out.println(); } public static void main(String args[])
{
GraphConnDemo test = new GraphConnDemo();
test.testStrongConn();
test.testWeakConn();
}
}

图示

结果

Strongly connected components:
[f]
[h]
[i]
[a, b, c, d]
[e] Weakly connected components:
[a, b, c, d, e]
[f, h, i]

例3:子图

import java.util.HashSet;
import java.util.List;
import java.util.Set; import org.jgrapht.DirectedGraph;
import org.jgrapht.alg.KosarajuStrongConnectivityInspector;
import org.jgrapht.alg.interfaces.StrongConnectivityAlgorithm;
import org.jgrapht.alg.ConnectivityInspector;
import org.jgrapht.graph.DefaultDirectedGraph;
import org.jgrapht.graph.DefaultEdge;
import org.jgrapht.graph.DirectedSubgraph; public class GraphConnDemo
{
private DirectedGraph<String, DefaultEdge> directedGraph;
private DirectedGraph<String, DefaultEdge> directedSubGraph; public GraphConnDemo(){
directedGraph = new DefaultDirectedGraph<String, DefaultEdge>(DefaultEdge.class);
directedGraph.addVertex("a");
directedGraph.addVertex("b");
directedGraph.addVertex("c");
directedGraph.addVertex("d");
directedGraph.addVertex("e");
directedGraph.addVertex("f");
directedGraph.addVertex("h");
directedGraph.addVertex("i");
directedGraph.addEdge("a", "b");
directedGraph.addEdge("b", "c");
directedGraph.addEdge("c", "d");
directedGraph.addEdge("d", "a");
directedGraph.addEdge("c", "e");
directedGraph.addEdge("f", "h");
directedGraph.addEdge("f", "i");
} public void subGraph() {
Set<String> subNode = new HashSet<String>();
subNode.add("a");
subNode.add("d");
subNode.add("c");
subNode.add("f");
directedSubGraph = new DirectedSubgraph(directedGraph, subNode);
System.out.println(directedSubGraph.vertexSet());
System.out.println(directedSubGraph.edgeSet()); } public static void main(String args[])
{
GraphConnDemo test = new GraphConnDemo();
test.subGraph();
}
}

结果

[a, c, d, f]
[(c : d), (d : a)]

压测: 和networkX对比

对比数据:点:593514    边: 2373298

NetworkX(str)

JGraphT(str)

JGraphT(int)

建路网

955s

240s

224s

强连通算法

255s

76s

71s

内存峰值

71.82G

78.87G

62.9G

CPU峰值

3.2%

27%

28.5%

释放内存

33min

2min

2min

例4: 得到最短路径

    void testDijkstraShortestPath() {
DirectedGraph<String, DefaultEdge> g2 = new DefaultDirectedGraph<String, DefaultEdge>(DefaultEdge.class); String v1 = "v1";
String v2 = "v2";
String v3 = "v3"; // add the vertices
g2.addVertex(v1);
g2.addVertex(v2);
g2.addVertex(v3); // add edges to create a circuit
g2.addEdge(v1, v2);
g2.addEdge(v2, v3); DijkstraShortestPath dijk = new DijkstraShortestPath(g2);
GraphPath<Integer, DefaultWeightedEdge> shortestPath1 = dijk.getPath(v1, v3);
GraphPath<Integer, DefaultWeightedEdge> shortestPath2 = dijk.getPath(v1, v2);
GraphPath<Integer, DefaultWeightedEdge> shortestPath3 = dijk.getPath(v1, v1);
GraphPath<Integer, DefaultWeightedEdge> shortestPath4 = dijk.getPath(v2, v1);
GraphPath<Integer, DefaultWeightedEdge> shortestPath5 = dijk.getPath(v2, v3);
GraphPath<Integer, DefaultWeightedEdge> shortestPath6 = dijk.getPath(v2, v2);
GraphPath<Integer, DefaultWeightedEdge> shortestPath7 = dijk.getPath(v3, v1);
GraphPath<Integer, DefaultWeightedEdge> shortestPath8 = dijk.getPath(v3, v2);
GraphPath<Integer, DefaultWeightedEdge> shortestPath9 = dijk.getPath(v3, v3); }

同时也可以判断两点之间是否可连通

JGraphT的更多相关文章

  1. 基于JGraphT实现的路径探寻

    基于JGraphT实现的路径探寻 业务中提出基于内存,探寻的两点间的有向以及无向路径,多点间的最小子图等需求,以下记录使用JGraphT的实现过程. GraphT是免费的Java类库,提供数学图论对象 ...

  2. 利用JGrapht对有向无环图进行广度优先遍历

    环境需求:JDK:1.8 jar:jgrapht-core-1.01.jar package edu; import org.jgrapht.experimental.dag.DirectedAcyc ...

  3. Java资源大全中文版(Awesome最新版)

    Awesome系列的Java资源整理.awesome-java 就是akullpp发起维护的Java资源列表,内容包括:构建工具.数据库.框架.模板.安全.代码分析.日志.第三方库.书籍.Java 站 ...

  4. Java资源大全中文版(Awesome最新版)(转载)

    原文地址:http://www.cnblogs.com/best/p/5876559.html 目录 业务流程管理套件 字节码操作 集群管理 代码分析 编译器生成工具 构建工具 外部配置工具 约束满足 ...

  5. Java资源大全

    古董级工具 这些工具伴随着Java一起出现,在各自辉煌之后还在一直使用. Apache Ant:基于XML的构建管理工具. cglib:字节码生成库. GlassFish:应用服务器,由Oracle赞 ...

  6. 最受欢迎的Java第三方库

    前言 翻译自programcreek: 典型的Java项目通常会依赖一些第三方库,本文总结了一些最受欢迎的Java库,这些类库在各种应用程序中被广泛使用: 当然,Java SDK是最广泛使用的Java ...

  7. Github优秀java项目集合(中文版) - 涉及java所有的知识体系

    Java资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-java 就是 akullpp 发起维护的 Java 资源列表,内容 ...

  8. twitter storm源码走读之8 -- TridentTopology创建过程详解

    欢迎转载,转载请注明出处,徽沪一郎. 从用户层面来看TridentTopology,有两个重要的概念一是Stream,另一个是作用于Stream上的各种Operation.在实现层面来看,无论是str ...

  9. [Java,JavaEE] 最常用的Java库一览

    引用自:http://www.importnew.com/7530.html 本文由 ImportNew - 邢 敏 翻译自 programcreek.欢迎加入Java小组.转载请参见文章末尾的要求. ...

随机推荐

  1. 在Windows 8.1中安装必应输入法

    鉴于目前Windows 8.1中自带的输入法存在一些Bug以及功能上的不完整性(比如,在Office 2013中删除掉错误的字符后快速输入第一个字母将丢失的问题:在QQ聊天窗口中文输入状态下快速输入省 ...

  2. VBA 代码

    Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA& ...

  3. Docker实践(二):容器的管理(创建、查看、启动、终止、删除)

    docker官方文档地址如下:[https://docs.docker.com/engine/reference/](https://docs.docker.com/engine/reference/ ...

  4. 实验8 LCD8*8点阵

    1.控制点阵红绿交替显示,分别从上到下,从左到右循环闪烁三次 接线: P0接J12.P1接J20.P2接J19 /** 1.控制点阵红绿交替显示,分别从上到下,从左到右循环闪烁三次 **/ #incl ...

  5. 路由其实也可以很简单-------Asp.net WebAPI学习笔记(一)

    MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一位程序猿,在他MVC程序中,一切皆路由,url中是完全拒绝"?"和“&”.对此,我 ...

  6. 基于tkinter的九型人格测试系统介绍

    基于tkinter的九型人格测试系统介绍 一.程序代码地址,GitHub 二.程序介绍 1.login.py 登录界面: 注册界面: 2.mainWindow.py 登录成功之后的界面: 3.doTe ...

  7. JavaScript基础(3)-JS中的面向对象、定时器、BOM、位置信息

    一.创建对象的几种常用方式. 1.使用Object或对象字面量创建对象: a.使用Object()内置的构造函数来创建对象,例如: var student = new Object(); // 创建一 ...

  8. C# byte array 跟 string 互转

    用 System.Text.Encoding.Default.GetString() 转换时,byte array 中大于 127 的数据转 string 时会出问题. 把这里的 Default 换成 ...

  9. 交换机与VLAN

    1. 交换机 1.1 定义 交换机是一种基于MAC地址识别,能完成封装转发数据帧功能的网络设备. HUB集线器是一种物理层共享设备,HUB本身不能识别MAC 地址和IP地址,当同一局域网内的A主机给B ...

  10. Java - 获取帮助信息

    在线开发文档 Java SE 8 Java SE 8 Developer Guides Java SE 8 API Specification Java API Specifications 离线开发 ...