← Все вопросы

Эйлеров путь существует или нет: как проверить условия и при чём тут связность?

Задан 3 месяца назад717 просмотров2 ответа
8

Дан неориентированный граф. Нужно понять, есть ли в нём эйлеров путь (проходит по каждому ребру ровно один раз) или эйлеров цикл. Помню что-то про чётность степеней, но путаюсь: когда путь, когда цикл, и обязательно ли граф должен быть связным?

2 ответа

13
✓ Принятый ответ — помог автору

Для неориентированного графа (рассматриваем только вершины с ненулевой степенью, изолированные игнорируем):

  • Эйлеров цикл существует ⇔ граф связен (по рёбрам) И все вершины имеют чётную степень.
  • Эйлеров путь (но не цикл) существует ⇔ граф связен И ровно две вершины имеют нечётную степень (они будут концами пути).
  • Нечётных вершин не может быть 1 или 3 — степени в сумме чётны, число нечётных вершин всегда чётно.

Связность обязательна — нельзя обойти рёбра в разных компонентах одним маршрутом. Проверяем связность только по вершинам со степенью > 0.

bool hasEulerPath(int n, vector<int> g[]) {
    int odd = 0, start = -1;
    for (int v = 0; v < n; v++) {
        if (g[v].size() % 2) { odd++; }
        if (!g[v].empty() && start == -1) start = v;
    }
    if (odd != 0 && odd != 2) return false;
    // проверить, что все вершины с deg>0 в одной компоненте (DFS/DSU от start)
    // ... обход, посчитать достижимые с deg>0; сравнить с общим числом таких вершин
    return /* связность по ненулевым вершинам */ true;
}

Для ориентированного графа условия другие: эйлеров цикл ⇔ для каждой вершины indeg == outdeg и граф сильно связен (по ненулевым вершинам); путь ⇔ ровно одна вершина с outdeg - indeg == 1 (старт), одна с indeg - outdeg == 1 (финиш), остальные indeg == outdeg, и связность подходящая.

Сложность проверки O(V+E).

5

Хочу подчеркнуть граблю «связность по ненулевым вершинам». Изолированные вершины (степень 0) не мешают существованию эйлерова пути — их просто не существует для маршрута по рёбрам. Если проверять связность всего графа наивно (число компонент == 1), получите неправильный «нет» на тесте с лишней изолированной вершиной.

Правильно: найти любую вершину со deg>0, запустить из неё обход, и убедиться, что все остальные вершины с deg>0 достижимы. Если да — связность ок. Это типичная ловушка в задачах на эйлеровость.

Ваш ответ

Войдите, чтобы ответить на вопрос.