Является ли алгоритмом Дейкстры для направленных или неориентированных графов?

Я продолжаю пытаться это сделать, но результаты, которые я нахожу, просто добавляют к моей путанице. Кажется, что он может быть использован для обоих? Если да, то какой он предназначен по умолчанию и что нужно изменить, чтобы заставить его работать не по умолчанию (независимо от того, направлено или ненаправлено)?

Изменить: для справки, у меня была проблема в последнем семестре, где мне был предоставлен список, подобный этому (аэропорты):

AER,KZN,1.8835
ASF,KZN,1.3005
ASF,MRV,1.1204
CEK,KZN,1.9263
CEK,OVB,1.6733
DME,KZN,1.7892
DME,NBC,2.2319
DME,UUA,2.3786
EGO,KGD,1.4649
EGO,KZN,1.2603
GYD,NBC,2.0755

Мне сказали, что это было направлено, и попросил найти самый короткий путь. Я положил его в алгоритм Dijkstra, который я нашел в Github (это был среднесрочный компьютер с открытым компьютером, поэтому у нас не было достаточно времени, чтобы написать алгоритм с нуля), и мой профессор сказал, что самый короткий путь, который он вернул, был неправильным и что это было даже не возможный путь, потому что список должен был быть направлен. Я не был уверен, должен ли я затем изменить алгоритм или список, чтобы сделать эту коррекцию. В итоге это было то, что второй самый короткий путь, который он вернул, был на самом деле направленным кратчайшим путем, но мне все еще интересно, в чем проблема.

Ответ 1

Он может применяться к обоим. Вот почему:

Неориентированный граф в основном совпадает с ориентированным графом с двунаправленными соединениями (= два соединения в противоположных направлениях) между связанными узлами.

Таким образом, вам не нужно ничего делать, чтобы заставить его работать для ненаправленного графика. Вам нужно знать только все узлы, которые могут быть достигнуты из каждого данного node через, например, список смежности.

Ответ 2

Вы можете использовать алгоритм Dijkstra как в направленных, так и в неориентированных графах, потому что вы просто добавляете ребра в PriorityQueue, когда у вас есть край для перемещения из списка смежности. Например, если один из моих узлов имеет ребро от A до B веса 3, тогда, если он направлен из BI, он не сможет добавить ребро обратно в A, тогда как от AI может добавить его в B.

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

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

Ошибка была бы в том, что ребра были дважды назначены в виде неориентированного графа. Вы должны быть осторожны при разборе краев в начале в своих объектах, чтобы не дублировать края в списке смежности.

Ответ 3

Алгоритм Djikstras обычно используется для Положительных взвешенных графиков. Возможно, вы сбиваете с толку алгоритм ширины первого поиска (BFS), который по существу является Djikstras для невзвешенных графиков. Разница (между Djikstras и BFS) заключается в том, когда вы имеете дело с взвешенными путями, теперь мы должны рассмотреть корректировки затрат на трассировку (веса) и решения, по которым узлы будут посещаться после текущего.

Ответ 4

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

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

Ответ 5

Да, Дейкстра работает как для режиссера, так и для режиссера. неориентированный граф, но весь вес ребра должен быть мне +ve. Потому что, если какой-либо вес равен -ve, он может не дать правильного ответа. Он работает на неориентированном графе, потому что в Дейкстре мы всегда должны видеть, что минимальное ребро wt. Из своей исходной вершины