Implémentation de l'algo de Dijkstra en C

Fermé
Thierry - 20 déc. 2005 à 20:51
 kenza440 - 8 mars 2012 à 11:14
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

mamiemando Messages postés 33433 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 décembre 2024 7 809
18 avril 2006 à 18:55
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
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
slt.pouvez vous médé pour lalg de djikstra le plus to ossibl stp. é merci en avance
0
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
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