Дан неориентированный граф. Ранг вершины — её степень. Ранг графа = max (rk(u) + rk(v)) по всем рёбрам (u,v). Найти ранг графа.
Рёбра графа: 0-1, 0-2, 0-3, 3-4
Каждое ребро (u,v) добавляет +1 к степени обоих концов.
| вершина | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| deg | 3 | 1 | 1 | 2 | 1 |
У вершины 0 три ребра (к 1, 2, 3); у вершины 3 — два (к 0 и 4).
| ребро | deg u + deg v | сумма |
|---|---|---|
| 0 – 1 | 3 + 1 | 4 |
| 0 – 2 | 3 + 1 | 4 |
| 0 – 3 | 3 + 2 | 5 ← max |
| 3 – 4 | 2 + 1 | 3 |
Ранг графа = 5 (жирное ребро 0–3).
Наблюдение: сам граф как структуру (список смежности / матрицу) хранить не нужно. Нужны только: массив степеней и список рёбер — а список рёбер уже есть на входе.
(u,v): deg[u] += 1, deg[v] += 1.deg[u] + deg[v], держим максимум.Почему именно два прохода, а не один: степени должны быть досчитаны полностью до того, как берём суммы. В одном цикле на момент первого ребра степени ещё не готовы → получишь неверный максимум.
Время O(|V| + |E|) Память O(|V|)
Два прохода по рёбрам — O(|E|), создание массива степеней — O(|V|).
def graph_rank(n, edges): # n — число вершин (нумерация 0..n-1), edges — список пар (u, v) deg = [0] * n # проход 1: степени for u, v in edges: deg[u] += 1 deg[v] += 1 # проход 2: максимум суммы степеней концов ребра best = 0 for u, v in edges: best = max(best, deg[u] + deg[v]) return best
best = 0 вернёт 0 — уточни у экзаменатора, годится ли это, или нужен особый случай.n; с 1 → размера n+1. Иначе IndexError.(v,v) обычно добавляет к степени 2. Кратные рёбра считаются каждое. Если они есть в твоём варианте — спроси, как их учитывать.