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 подскажет развёрнутый ответ в реальном времени.