Как я могу получить все возможные подграфы графа в JGraphT в коллекции List<MyGraph>
или Set<MyGraph>
? Я прочитал документацию JGraphT, но не смог найти ничего, что помогло бы мне решить эту конкретную проблему.
Получить все подграфы в JGraphT
Ответы (1)
Ответ на этот вопрос зависит от того, хочет ли ОП подграф поведенный вершиной или Подграф индуцированный краем. Чтобы создать подграф, индуцированный вершиной или ребром, в JGraphT, используйте AsSubgraph класс. Не существует метода, который просто сгенерирует все возможные подграфы, так как это очень необычная процедура, но ее легко реализовать самостоятельно. Обратите внимание, что существует 2^n
возможных подграфов, порожденных вершинами, где n
— количество вершин. Таким образом, количество подграфов огромно.
- Создайте список‹Set›, содержащий все возможные подмножества вершин. Это называется набором мощности (есть много сообщений SO о том, как создать набор мощности)
- Для каждого набора в вашем наборе мощности создайте индуцированный подграф, используя
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();