Я хочу найти минимальные вершины, которые соединяют определенные вершины друг с другом. Например, предположим, что список ребер равен connections = [(2,0),(0,5),(2,3),(3,4),(0,4),(4,1),(5,1)]
, а график будет таким, как показано ниже:
Затем я хочу знать, как соединить вершины 2, 4, 5
вместе с минимальным количеством вершин. В данном случае это вершина 0
.
Поэтому вывод должен быть [0,2,4,5]
, что означает, что необходимо 4 вершины. Я попытался реализовать алгоритм методом грубой силы, так как было бы больше сложных случаев, но я не уверен, как найти лучший ответ из всех возможных комбинаций.
from itertools import combinations
verticis = [0,1,2,3,4,5]
connections = [(2,0),(0,5),(2,3),(3,4),(0,4),(4,1),(5,1)]
key = [2,4,5]
i, j = 2, len(verticis)
res1 = [com for sub in range(j) for com in combinations(verticis, sub + 1)]
res2 = [com for sub in range(i - 1) for com in combinations(verticis, sub + 1)]
res = list(set(res1) - set(res2))
Therefore the output should be [0,2,4,5] which means 4 vertices needed.
. Я понимаю строчку перед этой, но эта меня немного смущает. - person Akshay Sehgal   schedule 28.11.2020is_connected
, которая сообщает вам, является ли граф связным или нет. Затем, используя вершины, которых нет в выбранном вами наборе [2, 4, 5], перечислите по порядку: все наборы из 0 вершин; все множества из 1 вершины; все наборы из 2 вершин; и т.д. (возможно, используя функции из модуляitertools
, чтобы помочь вам). Затем для каждого набора вершин сгенерируйте набор ребер, который использует только вершины из этого набора плюс вершины из вашего набора [2, 4, 5]. Используйте функциюis_connected
, чтобы узнать, подключен ли этот подграф или нет. Если он связан, остановите и верните этот набор вершин. - person Stef   schedule 28.11.2020