Hardmst
Как найти минимальное остовное дерево (MST)?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
MST — поддерево графа, соединяющее все вершины с минимальной суммой весов рёбер. Два классических алгоритма.
# Kruskal's: sort рёбра, добавлять если не создаёт cycle (через DSU)
def kruskal(n, edges):
edges.sort(key=lambda e: e[2])
dsu = DSU(n)
mst = []
for u, v, w in edges:
if dsu.union(u, v):
mst.append((u, v, w))
if len(mst) == n - 1:
break
return mst # O(E log E) из-за сортировки
# Prim's: добавлять минимальное ребро к непосещённой вершине
import heapq
def prim(graph, start):
visited = set([start])
heap = [(w, v) for v, w in graph[start]]
heapq.heapify(heap)
mst = []
while heap:
w, u = heapq.heappop(heap)
if u in visited:
continue
visited.add(u); mst.append((u, w))
for v, w in graph[u]:
if v not in visited:
heapq.heappush(heap, (w, v))
return mst # O(E log V)Применения: network design (min cost to connect cities), clustering, approximate TSP. В directed graphs MST не определено — есть arborescence (Edmonds).
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.