Как получить двудольный граф дополнений в networkx/python?

У меня есть двудольный граф, и я хотел бы извлечь двудольное дополнение этого графа. Это график G, объясненный в этой ссылке:

https://www.quora.com/Given-a-bipartite-graph-how-can-I-find-its-subgraph-that-is-a-complete-bipartite-graph-and-has-the-most- вершины

Я попытался сделать это, используя алгоритм дополнения библиотеки Networkx, но получил ребра между моими вершинами A и B, которые не должны быть соединены, потому что в двудольном графе нет ребер между одной и той же группой вершин.

Вот код, который я пробовал:

from networkx.algorithms.operators.unary import complement

B = bipartite.random_graph(5, 7, 0.2)
B = complement(B)

Но у меня есть соединения в одну и ту же группу вершин. Есть ли функция networkx или функция Python, которая с этим справляется?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
399
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Попробуй это:

import networkx as nx
B = nx.bipartite.random_graph(5, 7, 0.2)
G = nx.bipartite.complete_bipartite_graph(5,7)   #or use random_graph with probability 1
H = nx.difference(G,B)

Здесь используется разница, который возвращает граф, ребра которого являются ребрами в G, но не B.


Проблема с тем, что вы делали, заключается в том, что complement возвращает не двудольное дополнение, а полное дополнение. Он содержит ребра между всеми парами, которые не были соединены в исходном графе.

Спасибо. Что делать, если я создаю двудольный граф с нуля и хочу преобразовать его в полный двудольный граф, чтобы изменить ситуацию?

anthonya 29.05.2019 15:49

Если я правильно понял ваш вопрос: вы можете сделать то же самое, что я показал, со своими шагами по созданию B. Вы должны быть осторожны, чтобы имена узлов в вашем B соответствовали именам в G. Есть способы переименовать узлы в G, если это необходимо.

Joel 29.05.2019 16:13

использование * помогает нам импортировать все модули из пакета networkx. У нас есть функция, называемая дополнением в пакете networkx, я использовал ее в приведенном ниже коде.

from networkx import *
import networkx as nx
c=nx.complete_bipartite_graph(2,5)
cp=nx.complement(c)
nx.draw(cp)

Другие вопросы по теме