Я боролся некоторое время с проблемой конкурса (Конкурса Андрея Станкевича 21) об игре, которая выглядит следующим образом:
Ник и Питер любят играть в следующую игру [...]. Oни нарисуйте неориентированный двудольный граф G на листе бумаги и поместите токен в одну из его вершин. После этого они делают ходы по очереди. Ник движется первым.
Перемещение состоит из перемещения маркера вдоль края графика. После него вершина, где токен перед перемещением вместе со всеми ребрами, инцидентными ему, удаляются из графика. Игрок, у которого есть никакие действительные ходы не проигрывают игру.
Дается график, и теперь задача состоит в том, чтобы найти для данного старта node, побеждает ли игрок или проигрывает, если оба игрока играют оптимально. Подводя итог
- Двусторонний граф
- Нам дается начало node (скажем, с левой стороны)
- Мы движемся по очереди, шаг состоит из следующего ребра, но мы не можем посетить node, который уже был посещен
- Игрок, который не может двигаться, теряет
Поскольку граф двудольный, Ник (первый игрок) всегда удаляет node с левой стороны, а Peter всегда удаляет node с правой стороны.
Граф может содержать до 1000 узлов (не более 500 на каждой стороне) и 50000 ребер, поэтому необходим хороший алгоритм многочленного временного времени (срок составляет 2 секунды, чтобы решить все начальные позиции, но я думаю, что мы можем делиться большой информацией между разными исходными позициями).
Я уверен, что это может быть сведено к какой-либо проблеме покрытия или упаковки вершин, потому что граф двудольный, но я не могу найти стратегию, которая коррелирует с любым из них.
Я знаю решение для частного случая: пусть говорят, что стороны имеют n 1 и n 2 вершины соответственно. Если есть matching размера min (n 1, n 2)), и если игрок включен начинается меньшая сторона, чем существует выигрышная стратегия: он просто должен следить за согласованными ребрами и автоматически выигрывает.
Любые идеи?