2

Учитывая неориентированный график с положительными весами, существует 2 вида ребер: заблокированные края и разблокированные края. Определение, если заданное ребро заблокировано или разблокировано, принимает O (1).Минимальный путь в неориентированном графе с заблокированными и разблокированными ребрами

  1. При заданных двух вершин з, т и положительное число к = O (1), как можно найти кратчайший путь между сек и т который содержит на mostk закрытые кромки?

  2. При заданных двух вершин з, т и положительное число к = O (1), как можно найти кратчайший путь между сек и т который содержит точноk заблокированные края?

Я не знаю, как я могу запустить алгоритм Дейкстры на этом графике, чтобы найти кратчайший путь между заданными вершинами, и как я могу преобразовать неориентированный граф, в направленный один.

+0

Могут ли пустые циклы содержать циклы? Или это простые пути? – templatetypedef

+0

Лечить замки как вес. Если это заблокированный край, он имеет вес 1000. Это должно упростить его. –

+0

(Кстати - красивый значок Supaplex!) :-) – templatetypedef

ответ

5

Вы можете решить обе свои проблемы, взяв k копии графа, скажем G_0, ..., G_k, и модифицируйте каждый граф так, чтобы заблокированный край vw в G_i превратился в ребро от u в G_i до v в G_ {i + 1} и из v в G_i в u в G_ {i + 1}. Затем вы можете сделать кратчайшие пути с одним источником из вашего корня в G_0. Второй запрос решается путем считывания расстояния до цели в G_k, в то время как первый разрешается путем считывания минимального расстояния в любом G_i до цели.

+0

, поэтому, если u подключен к v, а v подключен к u, зачем мне копировать весь граф (или только вершины?) K раз и преобразовывать его в направленный? и как насчет «разблокированных» краев? Извините, я не получил ваше решение ... – TomerGod

+0

Я решил определить счетчик, инициализированный k, и уменьшить каждый раз, когда я обнаружил заблокированный край во время dijkstra algo. Есть ли проблемы с этим решением? – TomerGod

+0

Вы оставляете только разблокированные края. То есть разблокированный край между u и v становится ребром от u до v и другим ребром от v до u в G_i для каждого i. – tmyklebu