Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2723 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°366968
Miles--Teg
Posté le 19-04-2003 à 00:05:51  profilanswer
 

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

mood
Publicité
Posté le 19-04-2003 à 00:05:51  profilanswer
 

n°366977
EpoK
Let's burn
Posté le 19-04-2003 à 00:11:12  profilanswer
 

mal a la tete

n°367014
MagicBuzz
Posté le 19-04-2003 à 01:42:17  profilanswer
 

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

n°367032
xav14
Posté le 19-04-2003 à 07:48:00  profilanswer
 

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 :/)

n°367057
Miles--Teg
Posté le 19-04-2003 à 10:36:50  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
j arrive pas a parser mon xml comme je veux[algo - tris par tas] le parallèliser
[MySql] J'ai une idée, mais j'arrive pas à la mettre en oeuvre ! HelpL'algo du plus court chemin en C
[JS] algo de compression, zip ou autre[PHP] j'arrive pas a faire une simple requette mysql ??
[Algo] Info sur le Dominating Set ou Ensemble DominantsBesoin d'aide pour un pb d'algo !! siouplé...
pq j'arrive pas a me connecter a sql.free.fr alors qu'en localhost okSQL, : Je n'arrive pas à formuler la requète qui va bien...
Plus de sujets relatifs à : Algo de Dijkstra en C : j'y arrive pas !!!!


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR