Вот алгоритм линейного времени.
Во-первых, обратите внимание, что каждый цикл допустимой раскраски содержит четное количество красных ребер (я оставлю это в качестве упражнения).Учитывая цвета связующего дерева, существует ровно одно действительное завершение.Уникальность легко доказать, потому что цвет каждого ребра, не входящего в дерево, определяется соотношением цветов ребер дерева, с которым оно образует цикл.Я оставлю валидность в качестве другого упражнения (из-за извинения на время, извините).
Алгоритм состоит в том, чтобы использовать поиск в глубину, чтобы найти остовный лес заданных ребер, сохраняя четность цветов ребер между каждымузел и корень его дерева.Учитывая эти данные, мы можем проверить заданный цвет каждого ребра не в лесу.Если что-то не так, то есть 0 раскрасок.В противном случае существует 2 ^ (количество деревьев минус один) окраски.