Implémentation de l'algo de Dijkstra en C

Thierry -  
 kenza440 -
Bonjour,

je cherche à implémenter l'algorithme de Dijkstra en C afin de réaliser un programme de calcul du court chemin.

La vitesse d'exécution est un critère important donc je dois choisir une structure de donnée adaptée.

J'ai entendu que le tas de Fibonacci est la structure optimale pour cet algorithme. Mais je ne sais pas du tout comment réaliser cette structure !

Quelqu'un aurait il une suggestion, ça m'aiderait beaucoup ! Merci d'avance !

20 réponses

Résumé de la discussion

Dijkstra en C est discuté avec un enjeu de performance et la question porte sur l'utilisation d'une structure de données adaptée, notamment le tas de Fibonacci, pour accélérer le calcul du plus court chemin. Des réponses suggèrent d'aborder le problème par matrice d'adjacence ou d'utiliser une implémentation C++ avec des graphes et des listes, en précisant que Dijkstra calcule des vecteurs de poids et de successeurs. Pour aller plus loin, plusieurs interventions suggèrent d'examiner les bases de l'algorithme, notamment les étapes d'initialisation et de mise à jour des prédecesseurs et des poids, avant d'explorer des implémentations prêt-à l'emploi ou des bibliothèques.

Bobot (l'IA à votre service)
  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Si c'est une matrice c'est tout s'implement que tu appliques un Dijkstra en prenant pour source plusieurs (ou la totalité des) sommets du graphe.

    L'algorithme de Dijkstra retourne un vecteur de poids et un de successeurs. Il suffit donc de mettre ces vecteurs les uns en dessous des autres pour obtenir les deux matrices dont tu parles.

    Idéalement tu peux coder un algorithme de dijkstra qui prend en paramètre :
    - le graphe (ou la matrice décrivant le graphe)
    - le sommet source
    ... et qui retourne :
    - le vecteur de poids
    - le vecteur de successeurs

    On va supposer que les sommets sont identifiés par un entier pour simplifier, et que les arcs sont pondérés par un entier positif

    Exemple :
    typedef unsigned int vertex_t;
    typedef unsigned int weight_t;
    
    void dijkstra(
      const graph_t & g, // le graphe
      const vertex_t & src, // le sommet source
      std::vector<vertex_t> & succs,
      std::vector<weight_t> & poids
    ){
      // mon algo remplit succs et poids
    }

    ...qui sera appelée par une fonction qui calculera toute la matrice
    void dijkstra_matrix(
      const graph_t & g, // le graphe
      std::vector<std::vector<vertex_t> > & succs_mat,
      std::vector<std::vector<weight_t> > & poids_mat
    ){
      vertex_t vit=0;
      vertex_t vend=g.card_v(); //retourne le nombre de sommets
      for(vit = 0 ; vit != vend ; ++vit){
        //calculer le dijkstra pour la source courante
        std::vector<vertex_t> succs =  std::vector<vertex_t>(g.card_v());
        std::vector<weight_t> poids =  std::vector<weight_t>(g.card_v());
        dijkstra(g,vit,succs,poids);
        succs_mat.push_back(succs);
        poids_mat.push_back(poids);
      }
    }

    Il faut par ailleurs :
    - soit implémenter une classe de graphe
    - soit repartir d'une classe de graphe d'une lib existante, genre la lib boost
    - soit se baser sur une matrice d'adjacence décrivant le graphe, dans laquelle il faudra caractériser un poids infini pour les sommets non adjacents.

    Bonne chance
    7
    1. spamware
       
      salut , je te remercie pour ton aide mais j'ai pas eu de probleme pour construire les deux matrices , mon prg doit afficher :
      a chaque etape l'ensemble s et s'
      afficher en dernier etape la liste des plus court chemins entre tt couple
      de sommets ainsi que leurs valeurs.
      et merci encore
      0
    2. douja
       
      slt.pouvez vous médé pour lalg de djikstra le plus to ossibl stp. é merci en avance
      0
    3. tifou
       
      Bonjour,

      Tu met que ton algo remplit succs et poids,
      est-ce que tu pourrais mettre cet algo en ligne stp,

      merci d'avance
      0
    4. kenza440
       
      bonjour je doit implémenté un algo qui ordonnance des train et pour cela je doit donné comme paramétre la station de départ et la station d'arrivé pour avoir le plus court chemin entre les deux je fai comment
      merci d'avance
      0
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Donne moi ton code et on va essayer de voir (par contre je ne suis pas là ce week-end)...
    4
    1. spamware
       
      salut, je dois utiliser 2 matrices l'une contient les successeures et l'autre contient le poid de chaque arcs , c 1 tp que je dois rendre prochainement alors si tu a l'algo de dijkstra en c tu peux me le donner pour voir l'idée merci
      0
  3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Donne moi ton code actuel et on va regarder ça... Mais a priori c'est vraiment très simple, je suis un peu surprise que ça te bloque...
    3
    1. spamware
       
      c bon j'ai reussi a l'implementer tt seul
      0
      1. noucha000 Messages postés 2 Statut Membre > spamware
         
        salut sapamware
        c'est urgent!!!
        je suis nouvelle sur le site.
        je cherche le code du plus court chemin de dijkstra en c++ ou bien en c. si tu peux m'aider? mon adresse mariamoutman@yahoo.fr
        merci d'avance!!!
        0
  4. Legacy
     
    Bjr,
    je voudrais avoir le code C++ des algo Kruskal(à l'aide des ensembles disjoints et files de priorités dynamique) et de Prim
    2
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ARAKAZA ALEXIS
     
    je souhaiter une fonction enC/C++ qui facilte le plu bien possible de voyage d'une ville A à une villeB tout en minimisant le cout de voyage ce derneir est calculé selon la distance reliant les deux ville et sachant que je dispose de beaucoup de ville dans les quelle on peut passer appliquer l'algo du plu cours chemin merci
    2
    1. Zestel
       
      Ca sent le projet de graphe mon cher alexis :p
      0
  7. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Tiens c'est marrant j'en ai programmé un aujourd'hui, mais en c++. Tu peux te baser comme moi sur cette page :
    http://www.apprendre-en-ligne.net/graphes/dijkstra/algorithme.html

    Je viens de tomber sur une implémentation c++ ici mais ça te parle peut être moins :
    http://www.nimbustier.net/publications/djikstra/implementation.html

    Quoiqu'il en soit il faut que tu attrapes le reflexe GOOGLE !!!!! :-)

    Bonne chance
    1
    1. noucha000 Messages postés 2 Statut Membre
       
      salut mamiemando!!!
      je suis nouvelle sur le site ! je cherche le code de l'algorithme du plus court chemin de dijkstra. si vous pouvez m'aidez cela me fera très plaisir. mon adresse: mariamoutman@yahoo.fr
      merci d'avance!!!
      0
  8. spamware Messages postés 31 Statut Membre 3
     
    salut , je chercher l'algo de dijkstra en c , j'ai trouver sur google plusieurs algorithmes mais j'ai rien compris a la stucture alors si vous pouvez m'aider merci
    1
  9. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Je t'invite à relire les deux liens que j'ai donné précédemment :
    http://www.apprendre-en-ligne.net/graphes/dijkstra/algorithme.html
    https://www.nimbustier.net/publications/djikstra/implementation.html

    Anvant de s'attaquer à la compréhension du programme en C, il faut déjà avoir bien compris le principe de l'algorithme lui même :

    1) Initialisation
    - on choisit une source
    - on initialise un vecteur de prédecesseurs et de poids

    2) Itération
    - on cherche l'arc de poids minimal se raccrochant aux sommets traités
    - on met à jour le vecteur de prédécesseurs et de poids

    A l'issue de l'algorithme le vecteur de poids te donne le poids du plus court chemin pour chaque sommet du graphe, et le vecteur de prédecesseurs le sommet duquel il faut venir pour l'atteindre de manière optimale.

    On est dès lors en mesure de reconstituer les plus court chemin partant de la source pour chaque sommet du graphe à partir du vecteur de prédecesseurs.

    Bonne chance
    1
  10. spamware Messages postés 31 Statut Membre 3
     
    merci, mais j'ai deja visiter ces sites et ca ma pas trop aider
    1
  11. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    As-tu compris l'algorithme en lui même au delà de l'implémentation ?
    1
  12. spamware
     
    oui j'ai tres bien compris l'algo de dikstra , j'ai meme resolu des exercises concernant l'algo mais j'ai pas reussi a l'implementer en c j'ai essayé plusieurs methodes sans aboutir a un resultat
    1
    1. soso
       
      salut spamware... dis moi tu as tjrs ton code en C de dikjstra ?? ça m'interesse si c'est possible de l'avoir ? :)
      0
  13. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Ben là c'est juste du C... Il faudrait que tu nous donnes ton algorithme pour qu'on voit ce qui déconne. Mais normalement si tu transpose les algos donnés dans les liens ci-dessus il n'y a pas de soucis.

    Bonne chance
    1
    1. spamware
       
      je trouve que pour implementer l'algo de dijkstra en c est un peu compliquer et c'est pas aussi simple que tu le dis , j'ai bien compris le principe mais je seche dans les iterations et merci quand meme
      0
  14. Mouna
     
    Salut,
    je cherche à implémenter l'algorithme de Dijkstra en matlab afin de réaliser un programme de calcul du court chemin
    1
  15. TURBOXPLAY
     
    slt, j'ai b1 lus les différentes reponses, mais moi je voulais plus cette implémentation en C++, si quelqu'un peut m'aider ça me fera très plaisir.....
    1
  16. Vicking54 Messages postés 95 Statut Membre 26
     
    moi j'ai eu un projet cette année qui était le calcul du plus court chemin dans des graphes pour plusieurs milliers de noeud, avec tableau trié dans l'ordre décroissant et tas binomaux. mais on trouve les algo qu'il faut sur google et a toi de l'adapter à tes besoins. Personnellement j'ai tous programmé en C++
    1
  17. doudou
     
    je ve lalg de djikstra. svp tré urgen?
    0
    1. noucha000
       
      envoie moi ton mail je vais t'envoyer l'algorithme implémenté en c.
      0
      1. douja > noucha000
         
        salu,comen sa va stp pe tu menvoyé lalg de djikstra le plu to poss .merci davance
        0
      2. jlh > noucha000
         
        Bonjour je veux appliquer lalgo de dijkstra sur mon code de graphe qui affiche les stations parisiennes et je ne sais pas comment faire.
        merci
        0
      3. Chrls.0 > noucha000
         
        Salut,

        je me baladais sur le forum car je suis en train de coder un jeu, j'essaye de coder l'algorithme de Dijkstra sans résultat, j'ai vu que tu proposais de l'envoyer à qui laisserait son mail donc j'essaye même si le post date d'un an:
        chrls.0@hotmail.fr sa me sauverait la vie!

        D'avance merci :)
        0
      4. Chrls.0 > noucha000
         
        chrls.0@hotmail.fr
        0
  18. informatique
     
    si tu trovez le solution envoier a la mail mlahcine@yahoo.fr
    0
  19. salimasalima80
     
    je veut l'algorithme de plus court chemin
    0
  20. allal
     
    merci mais je veu les procedures suivantes de l'Initialisation et l'ajout et suppression et l'affichage d'un graphe
    -1