Warm tip: This article is reproduced from serverfault.com, please click

java-获取JGraphT中的所有子图

(java - Get all subgraphs in JGraphT)

发布于 2020-11-29 20:02:54

如何在List<MyGraph>Set<MyGraph>集合中的JGraphT中获得图形的所有可能的子图我已经阅读了JGraphT的文档,但是找不到任何可以帮助我解决该特定问题的东西。

Questioner
Ashkan Sajadi
Viewed
11
Joris Kinable 2020-12-01 03:51:24

这个问题的答案取决于OP是否需要顶点诱导子图或边诱导子图。要在JGraphT中创建顶点或边诱导的子图,请使用AsSubgraph类。没有一种方法可以简单地生成所有可能的子图,因为这是一个非常不常见的过程,但是你很容易实现。请注意,2^n可能存在顶点诱导子图,其中n顶点数。因此,子图的数量巨大。

  1. 创建一个List <Set>,其中包含所有可能的顶点子集。这称为电源集(关于如何生成电源集有很多SO帖子)
  2. 对于Powerset中的每个集合,请使用生成归纳子图AsSubgraph

粗略地讲,代码如下所示:

//Initiate some graph. The vertex/edge type is irrelevant for this question
Graph<Integer,DefaultEdge> graph = new SimpleGraph<>(DefaultEdge.class);
...

//Generate powerset
List<Set<Integer>> powerSet = powerSet(graph.vertexSet());

//Create subgraphs:
for(Set<Integer> subset : powerSet)
    Graph<Integer,DefaultEdge> subGraph = new AsSubgraph(graph, subset);

要实现powerSet函数,可以在SO上找到许多示例。要计算边缘诱发的子图,请重复上述步骤,但要使用graph.edgeSet()代替graph.vertexSet();