Принцип слияния
Цикл ломает счёт снизу вверх. Оказывается, весь цикл равносилен чётности числа его рёбер.
2 мин
На дереве значения считаются снизу вверх: разрубив ребро, мы отрываем поддерево, и оно больше не участвует. Цикл ломает это рассуждение — стерев ребро цикла, мы ничего не оторвём, вершины останутся связаны в обход.
Формулировка
Принцип слияния. Вершины, лежащие на одном цикле, можно склеить в одну; рёбра цикла превращаются при этом в петли при склеенной вершине. Значение игры не меняется.
Петля — это ребро, которое стирается, ничего не отрывая, то есть игра ценности : один ход и всё. Значит, цикл длины равносилен петлям, а их суммарное значение —
Треугольник равносилен одному ребру. Квадрат равносилен пустоте. Это самая полезная форма правила: длина цикла не важна, важна её чётность.
Как считать
Всё, что связано циклами, сливается в одну вершину — то есть каждая компонента рёберной двусвязности превращается в точку. Оставшиеся рёбра — это мосты, и они образуют дерево. Дальше работает обычное правило для дерева:
где — количество рёбер внутри компоненты (петли и кратные рёбра считаются).
Порядок работы:
- найти мосты обходом в глубину;
- сжать компоненты рёберной двусвязности;
- подвесить дерево мостов за компоненту с землёй;
- посчитать значение снизу вверх.
Всё вместе — .
Мелочи, на которых спотыкаются
- Петля во входных данных — это цикл длины , то есть готовое ребро внутри компоненты. Отдельного разбора не требует, но и выбрасывать её нельзя.
- Кратные рёбра — цикл длины , то есть чётность. Два параллельных ребра между вершинами вместе дают ноль, а не два.
- Отдельные компоненты связности, не соединённые с землёй, в игре не участвуют вовсе: они уже отвалились.
- Мосты искать без рекурсии — по той же причине, что и всё остальное на больших графах.
Смежное: Гранди на деревьях, сумма игр.