Во-первых, я предполагаю, что количество цветов является фиксированным.Затем я бы предложил алгоритм Dijkstra для установки меток (сравните с Pareto Dijkstra), в результате чего время выполнения O (n log (n) + m):
Используйте обобщенный Dijkstra, чтобы найти кратчайший путь: каждыйузел имеет список меток, одна метка состоит из длины от начального узла и всех посещенных цветов.Одна метка доминирует над другой меткой в этом узле, если (1) она имеет меньшую длину и (2) она включает в себя все цвета другой метки.Доминирующий ярлык удаляется напрямую.Подобно dijkstra, у вас есть приоритетная очередь, из которой вы всегда расслабляете узел с меньшей длиной.Перетаскивание ребра в узел v увеличит длину метки на длину конца и добавит цвет кромки к метке.Метка добавляется в список меток узла v. При назначении целевого узла меткой, содержащей все три цвета, вы нашли кратчайший путь.Обратите внимание, что вы должны сохранить узел-предшественник для каждой метки, если вы хотите восстановить кратчайший путь в конце.
Вы начинаете с начальной метки на начальном узле с (0, {}) (нулевая длина ибез цвета).
Каждый узел может быть установлен не более одного раза для каждой комбинации набора цветов, поскольку в этом случае существует только 8 (фиксированных) таких комбинаций, время выполнения равно алгоритму Дейкстры, который равен O (n* log (n) + m) для лучшей реализации.