web-dev-qa-db-fra.com

Est l'algorithme de Dijkstra pour les graphiques dirigés ou non dirigés?

Je continue d'essayer de google, mais les résultats que je trouve ne font qu'ajouter à ma confusion. Il semble qu'il puisse éventuellement être utilisé pour les deux? Si oui, pour quoi est-il conçu par défaut et qu'est-ce qui doit être changé pour que cela fonctionne par défaut (que ce soit dirigé ou non)?

Edit: pour référence, j'ai eu un problème le semestre dernier où on m'a donné une liste comme ça (aéroports):

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

On m'a dit que c'était dirigé et on m'a demandé de trouver le chemin le plus court. Je l'ai mis dans un algorithme de Dijkstra que j'ai trouvé sur Github (c'était un ordinateur à mi-parcours donc nous n'avions pas assez de temps pour écrire l'algorithme à partir de zéro) et mon professeur a dit que le chemin le plus court qu'il renvoyait était incorrect et qu'il était pas même un chemin possible car la liste était censée être dirigée. Je ne savais pas si je devais alors modifier l'algorithme ou la liste pour faire cette correction. Il s'est avéré que le deuxième chemin le plus court retourné était en fait le chemin le plus court dirigé, mais je me demande toujours quel était le problème.

13
Austin

Il peut être appliqué aux deux. Voici pourquoi:

Un graphique non dirigé est fondamentalement le même qu'un graphique dirigé avec - bidirectionnel connexions (= deux connexions dans des directions opposées) entre les nœuds connectés.

Vous n'avez donc pas vraiment à faire quoi que ce soit pour le faire fonctionner pour un graphique non orienté. Vous avez seulement besoin de connaître tous les nœuds qui peuvent être atteints à partir de chaque nœud donné via, par exemple. an liste de contiguïté.

28
Keiwan

Vous pouvez utiliser l'algorithme de Dijkstra dans les graphiques à la fois dirigés et non dirigés, car vous ajoutez simplement des bords dans PriorityQueue lorsque vous avez un bord à parcourir à partir de votre liste d'adjacence. Par exemple, si l'un de mes nœuds a un Edge de A à B de poids 3, alors s'il est dirigé à partir de B, je ne pourrai pas ajouter de nouveau Edge à A, tandis qu'à partir de A, je pourrais l'ajouter à B.

Comme les autres réponses, assurez-vous de ne pas le confondre avec des poids. L'algorithme de Dijkstra s'exécute sur des graphiques pondérés positifs, sinon la file d'attente prioritaire serait inutile.

Dans votre exemple, l'algorithme de Dijkstra fonctionnerait parce que le graphique est à la fois pesé (positivement) et a des bords dirigés.

La faute aurait été que les bords ont été affectés deux fois sous la forme d'un graphique non orienté. Vous devez être prudent lorsque vous analysez les bords au début dans vos objets pour ne pas dupliquer les bords dans la liste d'adjacence.

5
MathBunny

L'algorithme Djikstras est généralement utilisé pour les graphiques positifs pondérés. Vous le confondez peut-être avec l'algorithme de recherche en largeur (BFS), qui est essentiellement Djikstras pour les graphiques non pondérés. La différence (entre Djikstras et BFS), c'est lorsque vous traitez avec des chemins pondérés, nous devons maintenant considérer les ajustements des coûts de chemin (poids) et les décisions sur les nœuds à visiter après le courant.

4
Luvy

Un graphique dirigé signifie simplement que les arêtes reliant les sommets sont capables de se connecter dans un sens, mais pas dans l'autre. Cela signifie qu'un sommet peut être adjacent à un autre, mais qu'un autre sommet peut ne pas être adjacent au premier sommet.

Dans le contexte de l'algorithme de Dijkstra, que le graphique soit orienté ou non importe peu. L'algorithme de Dijkstra fait simplement référence aux sommets adjacents d'un sommet. C'est cette liste de contiguïté que vous devrez modifier si vous changez un graphique de dirigé à non dirigé.

3
Aaron Wojnowski

Oui, Dijkstra fonctionne pour les graphiques dirigés et non dirigés, mais tout le poids des bords devrait me + ve. Parce que si un poids est faible, il peut ne pas donner la bonne réponse. Cela fonctionne sur un graphe non orienté car dans Dijkstra, nous devrions toujours voir que Edge minium wt. De son sommet source

0
Gulshan Kumar