JGraphT
例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的更多相关文章
- 基于JGraphT实现的路径探寻
基于JGraphT实现的路径探寻 业务中提出基于内存,探寻的两点间的有向以及无向路径,多点间的最小子图等需求,以下记录使用JGraphT的实现过程. GraphT是免费的Java类库,提供数学图论对象 ...
- 利用JGrapht对有向无环图进行广度优先遍历
环境需求:JDK:1.8 jar:jgrapht-core-1.01.jar package edu; import org.jgrapht.experimental.dag.DirectedAcyc ...
- Java资源大全中文版(Awesome最新版)
Awesome系列的Java资源整理.awesome-java 就是akullpp发起维护的Java资源列表,内容包括:构建工具.数据库.框架.模板.安全.代码分析.日志.第三方库.书籍.Java 站 ...
- Java资源大全中文版(Awesome最新版)(转载)
原文地址:http://www.cnblogs.com/best/p/5876559.html 目录 业务流程管理套件 字节码操作 集群管理 代码分析 编译器生成工具 构建工具 外部配置工具 约束满足 ...
- Java资源大全
古董级工具 这些工具伴随着Java一起出现,在各自辉煌之后还在一直使用. Apache Ant:基于XML的构建管理工具. cglib:字节码生成库. GlassFish:应用服务器,由Oracle赞 ...
- 最受欢迎的Java第三方库
前言 翻译自programcreek: 典型的Java项目通常会依赖一些第三方库,本文总结了一些最受欢迎的Java库,这些类库在各种应用程序中被广泛使用: 当然,Java SDK是最广泛使用的Java ...
- Github优秀java项目集合(中文版) - 涉及java所有的知识体系
Java资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-java 就是 akullpp 发起维护的 Java 资源列表,内容 ...
- twitter storm源码走读之8 -- TridentTopology创建过程详解
欢迎转载,转载请注明出处,徽沪一郎. 从用户层面来看TridentTopology,有两个重要的概念一是Stream,另一个是作用于Stream上的各种Operation.在实现层面来看,无论是str ...
- [Java,JavaEE] 最常用的Java库一览
引用自:http://www.importnew.com/7530.html 本文由 ImportNew - 邢 敏 翻译自 programcreek.欢迎加入Java小组.转载请参见文章末尾的要求. ...
随机推荐
- python全栈学习1.开课介绍
python————web && 爬虫 Django pyramid Tornado Bottle Flask GUI图形开发 QT 想要类似于执行shell脚本一样执行python ...
- nodeclub
nodeclub笔记:https://cnodejs.org/topic/535601a20d7d0faf140303d8 先看一下框架,把没有接触过的部分熟悉一下. 熟悉一下package.json ...
- es快捷键
ctrl+b ,从xml中的Design定位到代码中 ctrl+shift+t查找这个类,下面会显示类的路径,包括jar名 shift + ctrl + / :注释,如果选中多行的话,则会把选中区域注 ...
- B - Avoiding a disaster
Description Percy likes to be punctual. So much so that he always keeps three watches with him, so t ...
- VARCHAR的最大长度的问题
大家知道,在SQL Server 2000中,VARCHAR的最大长度是8000,如果字符串的长度超过8000,保存在VARCHAR中时就会被截断.如果你需要传入的参数恰好很长,比如是一个xml,很多 ...
- jQuery基础(2)
一.jQuery的属性操作 jQuery的属性操作分为四部分: html标签属性操作:是对html文档中的标签属性进行读取,设置和移除操作.比如attr().removeAttr(): DOM属性操作 ...
- cpu 亲和性 affinity
http://www.ibm.com/developerworks/cn/linux/l-affinity.html
- mybatis-spring集成:配置多数据库源中遇到的问题
转自:http://www.cfanz.cn/index.php?c=article&a=read&id=71583 mybatis配置多数据源本身很简单,和基本配置差别不大 但是如果 ...
- spring cloud 学习(6) - zuul 微服务网关
微服务架构体系中,通常一个业务系统会有很多的微服务,比如:OrderService.ProductService.UserService...,为了让调用更简单,一般会在这些服务前端再封装一层,类似下 ...
- 开发ASP.NET MVC 在线录音录像(音视频录制并上传)
最近有个在线招聘录音的开发需求,需要在招聘网站上让招聘者上传录音和视频. 找到两个不错的javascript开源,可以在除了IE以外的浏览器运行. https://github.com/mattdia ...