Algo de Dijkstra en C : j'y arrive pas !!!!

Algo de Dijkstra en C : j'y arrive pas !!!! - C++ - Programmation

Marsh Posté le 19-04-2003 à 00:05:51    

Salut,
voilà je dois faire en C l'algo de Dijkstra, avec une tri par tas (lequel est fait),
mais j'arrive pas à cerner l'algo et à le mettre en C !
Voilà ce que j'ai pour dijkstra :

Code :
  1. void Dijkstra ( GRAPHE *G , int depart , int *pere ) {
  2.   int *s_visite; /* BLANC si non visité, NOIR si visité */
  3.   int *d; /* correspond à l'estimation de la pondération du plus court chemin */
  4.   Liste l;
  5.   int i, n;
  6.   TAS tas;
  7.   ElementListe *u;
  8.    
  9.   /* Récupération du nb de sommets dans le graphe G */
  10.   n = G->nb_noeuds; 
  11.  
  12.   /* Initialisation des tableaux pour dijkstra */
  13.   s_visite = (int*) malloc ( n*sizeof (int) );
  14.   if ( s_visite == NULL ) {
  15.     fprintf(stderr,"\nErreur lors du malloc de l'initialisation du tableau s_visite !!\n" );
  16.     exit (1);
  17.   }
  18.  
  19.   d = (int*) malloc ( n*sizeof (int) );
  20.   if ( d == NULL ) {
  21.     fprintf(stderr,"\nErreur lors du malloc de l'initialisation du tableau d !!\n" );
  22.     exit (1);
  23.   }
  24.  
  25.   for ( i=0 ; i<n ; i++ ) {
  26.     d[i] = 100000;  /* 100000 pour dire l'infini */
  27.     pere[i] = -1;   /* Pour dire qu'aucun noeuds n'a de pere au début !! */
  28.     s_visite[i] = BLANC; /* Pour dire qu'aucun sommets n'est déjà visité */
  29.   }
  30.  
  31.   s_visite[depart] = NOIR;
  32.   d[depart] = 0; /* Fin initialisation */
  33.  
  34.   /* Creer le tas !!!! */
  35.   Creer_TAS ( &tas , n );
  36.  
  37.   /* Mettre ds le tas tous les sommets du graphe */
  38. /* ----> ON fait comment là ??? <------ */
  39.  
  40.   /* Recherche du chemin le plus court avec l'algo de Dijkstra */
  41.   while ( tas.nb_elt != 0 ) {
  42.  
  43.     u = Extraire_Min_TAS ( &tas );
  44.    
  45.     s_visite[u->valeur] = NOIR;
  46.    
  47.     l = G->tla[u->valeur]; /* recup le 1er elementliste sur lequel pointe u */
  48.    
  49.       while ( !EstVide ( l ) ) { /* Tant qu'il y a des sommets adjacents à u */
  50.      
  51.         Relacher ( u , l , pere , d );
  52.        
  53.         l = Reste ( l );
  54.        
  55.       }
  56.      
  57.   }
  58.  
  59. }
  60. int Relacher ( int u , Liste l , int *pere , int * d ) {
  61.   int w, v;
  62.  
  63.   v = l->valeur;
  64.  
  65.   w = l->poids;
  66.  
  67.   if ( d[v]>d[u]+w ) {
  68.  
  69.     d[v] = d[u] + w;
  70.    
  71.     pere[v] = u;
  72.    
  73.   }
  74.  
  75. }

 
ma strucutre de tas :
 

Code :
  1. struct s_tas {
  2.   ElementListe **tab; /* Un tableau de pointeurs sur des ElementListe */
  3.   int nb_elt;         /* nb d'elt à prendre en compte dans le tas */
  4.   int taille;         /* nb total d'elt du tas (le max) */
  5. };
  6. typedef struct s_tas TAS;


 
et ce qui faut pour comprende le tas :
 

Code :
  1. enum { BLANC, GRIS, NOIR }; /* Pour marquer les sommets */
  2. struct elementliste {
  3.   int valeur; /* Evident !! */
  4.   int poids; /* Poids sur l'arète */
  5.   struct elementliste *suivant; /* Pointeur sur un elementliste */
  6.                                 /* désignant l'elt suivant      */
  7. };
  8. typedef struct elementliste ElementListe, *Liste;
  9. typedef Liste *TLA;
  10. /* La structure pour le Graphe */
  11. struct s_graphe {
  12.   TLA tla; /* le tla */
  13.   int nb_noeuds;  /* le nb de noeuds du graphe */
  14.                   /* aussi appelés sommets     */
  15.   int nb_aretes;  /* le nb d'aretes du graphe  */
  16. };
  17. typedef struct s_graphe GRAPHE;

 
on considerera que les fonctions du tas son OK !! (si elles le sont pas, on verra plus tard ;o) !!)
 
Voilà, si quelqu'un qui avait fait cet algo en C pouvait me montrer ce qu'il a fait, ca m'aiderait beaucoup !!
 
Merci @+
Miles

Reply

Marsh Posté le 19-04-2003 à 00:05:51   

Reply

Marsh Posté le 19-04-2003 à 00:11:12    

mal a la tete

Reply

Marsh Posté le 19-04-2003 à 01:42:17    

Dijkstra, c'est bien un algo de cheminement dans les graphs non ?
 
T'ain c loin mes cours de maths :sweat:

Reply

Marsh Posté le 19-04-2003 à 07:48:00    

MagicBuzz a écrit :

Dijkstra, c'est bien un algo de cheminement dans les graphs non ?
 
T'ain c loin mes cours de maths :sweat:


 
plus court chemin (et encore je suis pas sûr alors que ca fait qu'un an :/)

Reply

Marsh Posté le 19-04-2003 à 10:36:50    

Oui c'est ca : le plus chemin d'un point a un autre ds un graphe !!
 
Des idées ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed