⚙️ Алгоритмы  ·  20 вопросов  ·  ~45 мин  ·  ⏱ Таймер 45:00  ·  Сложный  · 

Остовные деревья и связность

Минимальный остов соединяет все вершины с минимальной общей стоимостью, но не заменяет дерево кратчайших путей. Тест просит проверять кандидатов на цикл, вести компоненты DSU, расширять область Прима и распознавать рёбра, без которых граф распадается.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выбери один ответ из четырёх. В тесте 20 вопросов и 45 минут. После завершения откроются общий процент, четыре тематические шкалы, правильные ответы и пояснения.
Вопрос 1 из 20
Сколько рёбер в остовном дереве связного графа из 8 вершин?
|E_T|=|V|-1
Python
V = 8
print(V - 1)
Вопрос 2 из 20
Что минимизирует минимальное остовное дерево?
Вопрос 3 из 20
Какое ребро можно безопасно взять по свойству разреза?
Python
S = {0, 1, 4}
crossing_edges = [
    (4, 1, 2),
    (7, 4, 3),
    (9, 0, 5),
]

# Кортеж: (вес, вершина из S, вершина вне S).
Вопрос 4 из 20
Если все веса рёбер различны, что можно сказать о минимальном остовном дереве связного графа?
Вопрос 5 из 20
Является ли набор остовом?
Python
V = 5
chosen_edges = [(0, 1), (1, 2), (2, 0), (3, 4)]
parent = list(range(V))
cycle_found = False
for u, v in chosen_edges:
    if find(parent, u) == find(parent, v):
        cycle_found = True
    else:
        union(parent, u, v)
components = len({find(parent, v) for v in range(V)})
Вопрос 6 из 20
Какой суммарный вес выберет Краскал?
Python
def find(parent, x):
    if parent[x] != x:
        parent[x] = find(parent, parent[x])
    return parent[x]

def union(parent, a, b):
    ra, rb = find(parent, a), find(parent, b)
    if ra != rb:
        parent[rb] = ra

edges = [(1, 0, 1), (2, 1, 2), (2, 0, 2), (3, 2, 3), (4, 1, 3)]
parent = list(range(4))
total = 0
for weight, u, v in edges:
    if find(parent, u) != find(parent, v):
        union(parent, u, v)
        total += weight
print(total)
Вопрос 7 из 20
Что проверяет условие find(u) != find(v)?
Python
if find(u) != find(v):
    union(u, v)
    take(edge)
Вопрос 8 из 20
Зачем DSU использует сжатие путей?
Вопрос 9 из 20
Какие компоненты останутся после объединений?
Python
def find(parent, x):
    if parent[x] != x:
        parent[x] = find(parent, parent[x])
    return parent[x]

def union(parent, a, b):
    ra, rb = find(parent, a), find(parent, b)
    if ra != rb:
        parent[rb] = ra

parent = list(range(6))
for a, b in [(0, 1), (2, 3), (1, 2), (4, 5)]:
    union(parent, a, b)
components = {}
for vertex in range(6):
    root = find(parent, vertex)
    components.setdefault(root, set()).add(vertex)
print(list(components.values()))
Вопрос 10 из 20
Когда Краскал особенно удобен?
Вопрос 11 из 20
Какое ребро выберет Прим следующим?
Python
used = {0, 1}
frontier = [
    (6, 0, 2),
    (2, 1, 2),
    (5, 1, 3),
]

# Кортеж: (вес, вершина в дереве, новая вершина).
# На следующем шаге Прим выбирает одно ребро frontier.
Вопрос 12 из 20
Почему запись из кучи пропускается?
Python
while heap:
    weight, vertex, parent = heappop(heap)
    if used[vertex]:
        continue
    break
Вопрос 13 из 20
Чем Прим отличается от Краскала по росту решения?
Вопрос 14 из 20
Какой суммарный вес получится?
Python
from heapq import heappush, heappop

graph = {
    0: [(1, 4), (2, 1)],
    1: [(0, 4), (2, 2), (3, 1)],
    2: [(0, 1), (1, 2), (3, 5)],
    3: [(1, 1), (2, 5)],
}

# Алгоритм Прима стартует из вершины 0
# и каждый раз берёт минимальное граничное ребро.
Вопрос 15 из 20
Какая реализация Прима часто лучше для очень плотного графа в матрице?
E\approx V^2
Вопрос 16 из 20
Что ответит DSU после операций?
Python
def find(parent, x):
    if parent[x] != x:
        parent[x] = find(parent, parent[x])
    return parent[x]

def union(parent, a, b):
    ra, rb = find(parent, a), find(parent, b)
    if ra != rb:
        parent[rb] = ra

parent = list(range(5))
for a, b in [(0, 1), (1, 2), (3, 4)]:
    union(parent, a, b)
print(find(parent, 0) == find(parent, 2),
      find(parent, 0) == find(parent, 4))
Вопрос 17 из 20
Является ли ребро 1-3 мостом?
Python
graph = {
    0: {1, 2},
    1: {0, 2, 3},
    2: {0, 1},
    3: {1},
}

edge = (1, 3)
# Проверяется, изменится ли число компонент
# после удаления edge из обеих множеств смежности.
Вопрос 18 из 20
Как характеризуется мост в неориентированном графе?
Вопрос 19 из 20
Какое условие указывает на мост в DFS-дереве?
Псевдокод
DFS(v, parent):
    tin[v] = low[v] = timer++
    for u in graph[v]:
        if u == parent: continue
        if visited[u]:
            low[v] = min(low[v], tin[u])
        else:
            DFS(u, v)
            low[v] = min(low[v], low[u])
            if [условие для ребра v-u]:
                bridges.add((v, u))
Вопрос 20 из 20
Почему DSU не подходит напрямую для произвольных удалений рёбер в ходе работы?
find/union\approx O(\alpha(n))

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу