Получить все подграфы в JGraphT

Как я могу получить все возможные подграфы графа в JGraphT в коллекции List<MyGraph> или Set<MyGraph>? Я прочитал документацию JGraphT, но не смог найти ничего, что помогло бы мне решить эту конкретную проблему.


person A. Sin    schedule 29.11.2020    source источник
comment
Что именно вы пробовали сами? Приведите минимальный пример, где вы застряли.   -  person Joris Kinable    schedule 30.11.2020


Ответы (1)


Ответ на этот вопрос зависит от того, хочет ли ОП подграф поведенный вершиной или Подграф индуцированный краем. Чтобы создать подграф, индуцированный вершиной или ребром, в JGraphT, используйте AsSubgraph класс. Не существует метода, который просто сгенерирует все возможные подграфы, так как это очень необычная процедура, но ее легко реализовать самостоятельно. Обратите внимание, что существует 2^n возможных подграфов, порожденных вершинами, где n — количество вершин. Таким образом, количество подграфов огромно.

  1. Создайте список‹Set›, содержащий все возможные подмножества вершин. Это называется набором мощности (есть много сообщений SO о том, как создать набор мощности)
  2. Для каждого набора в вашем наборе мощности создайте индуцированный подграф, используя 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.vertexSet() используйте graph.edgeSet();

person Joris Kinable    schedule 30.11.2020