Как найти минимальные вершины, которые соединяют определенные вершины друг с другом

Я хочу найти минимальные вершины, которые соединяют определенные вершины друг с другом. Например, предположим, что список ребер равен 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)) 

person Community    schedule 28.11.2020    source источник
comment
Это не задача о кратчайшем пути. Я хочу соединить эти 3 узла друг с другом с минимально возможным количеством узлов.   -  person    schedule 28.11.2020
comment
Очень интересный вопрос! Если вы не найдете здесь удовлетворительного ответа, попробуйте биржу стека компьютерных наук.   -  person Stef    schedule 28.11.2020
comment
См. также: Википедия: минимальная задача дерева Штейнера   -  person Stef    schedule 28.11.2020
comment
Что вы подразумеваете под Therefore the output should be [0,2,4,5] which means 4 vertices needed.. Я понимаю строчку перед этой, но эта меня немного смущает.   -  person Akshay Sehgal    schedule 28.11.2020
comment
Это означает, что узел 0 может соединять узлы 2, 4 и 5 друг с другом. У меня есть эта комбинация [0,2,4,5] в разрешении, но я не уверен, как выбрать ее как лучший ответ.   -  person    schedule 28.11.2020
comment
Предложение: Напишите функцию is_connected, которая сообщает вам, является ли граф связным или нет. Затем, используя вершины, которых нет в выбранном вами наборе [2, 4, 5], перечислите по порядку: все наборы из 0 вершин; все множества из 1 вершины; все наборы из 2 вершин; и т.д. (возможно, используя функции из модуля itertools, чтобы помочь вам). Затем для каждого набора вершин сгенерируйте набор ребер, который использует только вершины из этого набора плюс вершины из вашего набора [2, 4, 5]. Используйте функцию is_connected, чтобы узнать, подключен ли этот подграф или нет. Если он связан, остановите и верните этот набор вершин.   -  person Stef    schedule 28.11.2020
comment
Что вы подразумеваете под всеми множествами из 0 вершин...?   -  person    schedule 28.11.2020
comment
Ну, есть пустой набор :) Я говорю только о дополнительных вершинах, вершинах, не входящих в интересующий вас набор, поэтому пустой набор означает, что не добавляйте никаких вершин и проверяйте, связан ли уже индуцированный подграф.   -  person Stef    schedule 29.11.2020