💡 Инструкция: Выбери один ответ из четырёх. В тесте 20 вопросов и 45 минут. После завершения откроются общий процент, четыре тематические шкалы, правильные ответы и пояснения.
Вопрос 3 из 20
Какое ребро можно безопасно взять по свойству разреза?
Python Копировать
S = {0, 1, 4}
crossing_edges = [
(4, 1, 2),
(7, 4, 3),
(9, 0, 5),
]
# Кортеж: (вес, вершина из S, вершина вне S).
Вес 4
Вес 7
Вес 9
Любое из трёх независимо от веса
Вопрос 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)})
Да, потому что все вершины встречаются
Нет только из-за отсутствия весов
Нет: есть цикл и две компоненты
Да, потому что рёбер V−1
Вопрос 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
5
8
6
Вопрос 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()))
{0,1,2}, {3,4,5}
{0,1}, {2,3}, {4,5}
{0,1,2,3} и {4,5}
Одна компонента из шести
Вопрос 11 из 20
Какое ребро выберет Прим следующим?
Python Копировать
used = {0, 1}
frontier = [
(6, 0, 2),
(2, 1, 2),
(5, 1, 3),
]
# Кортеж: (вес, вершина в дереве, новая вершина).
# На следующем шаге Прим выбирает одно ребро frontier.
1-3 вес 5
0-2 вес 6
Ребро внутри S
1-2 вес 2
Вопрос 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
# и каждый раз берёт минимальное граничное ребро.
6
4
5
7
Вопрос 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))
False True
False False
True True
True False
Вопрос 17 из 20
Является ли ребро 1-3 мостом?
Python Копировать
graph = {
0: {1, 2},
1: {0, 2, 3},
2: {0, 1},
3: {1},
}
edge = (1, 3)
# Проверяется, изменится ли число компонент
# после удаления edge из обеих множеств смежности.
Нет: после удаления остаётся путь 3→2→1 через треугольник
Да только в том случае, если вес 1–3 меньше весов рёбер треугольника
Да: после удаления вершина 3 отделится от остальных
Нет: раз вершина 1 входит в цикл, каждое её ребро имеет обходной путь