begin process at 2012 05 28 12:47:30
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

Réseau & Internet

 > 

Algorithme de dijkstra


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Algorithme de dijkstra

jeudi 6 mai 2010 à 22:37:47 | Algorithme de dijkstra

hakim3129

Bonsoir Je viens terminé mon tp et je me rend conte qu'il y a des erreurs mais que je n'arrive pas cerné Alors si vous pouvez m'aider svp

#include <stdio.h>
#include <stdlib.h>
#include <string.h>



const int nb_ville=8;

//liste chainée simple classique
typedef struct Smaillon
{
int val;
struct Smaillon* suiv;
}S_maillon;


int cherche_succes( int** , int* ,int );
void dijksrta( int , int** , int ,char[3]);


int main()
{
int** dist,**temps;
int cpt,cpt2,temp;
FILE* fp;
int dep,arr;


//2 tableau a double entrée qui contiennent la distance et le tps entre 2 villes
dist=(int**)calloc(nb_ville,sizeof(int*));
temps=(int**)calloc(nb_ville,sizeof(int*));
for(cpt=0;cpt<nb_ville;cpt++)
{
dist[cpt]=(int*)calloc(nb_ville,sizeof(int));
temps[cpt]=(int*)calloc(nb_ville,sizeof(int));
}



//on rempli ces tableau grace au fichier villes.txt
fp=fopen("villes.txt","r");
for(cpt=0;cpt<nb_ville;cpt++)
{
for(cpt2=0;cpt2<nb_ville;cpt2++)
{
fscanf(fp,"%d,%d;",&dist[cpt][cpt2],&temps[cpt][cpt2]);
}
}
fclose(fp);
while(1)
{
system("cls");

printf("Choisissez votre ville de depart:\n");
printf("\t1-Alger\n");
printf("\t2-Oran\n");
printf("\t3-Annaba\n");
printf("\t4-Setif\n");
printf("\t5-Saida\n");
printf("\t6-Blida\n");
printf("\t7-Mostaghanem\n");
printf("\t8-Tlemcene\n");
scanf("%d",&dep);
dep--;

printf("Choisissez votre ville d'arrive:\n");
printf("\t1-Alger\n");
printf("\t2-Oran\n");
printf("\t3-Annaba\n");
printf("\t4-Setif\n");
printf("\t5-Saida\n");
printf("\t6-Blida\n");
printf("\t7-Mostaghanem\n");
printf("\t8-Tlemcene\n");
scanf("%d",&arr);
arr--;

dijkstra(dep,dist,nb_ville,arr,"km");
dijkstra(dep,temps,nb_ville,arr,"heures");

system("PAUSE");
}
return 0;
}

void affiche_ville(int ville)
{
switch(ville)
{
case(0):printf("Alger");
break;
case(1):printf("Oran");
break;
case(2):printf("Annaba");
break;
case(3):printf("Setif");
break;
case(4):printf("Saida");
break;
case(5):printf("Blida");
break;
case(6):printf("Mostaghanem");
break;
case(7):printf("Tlemcene");
break;

}
}

//fonction qui affiche les villes parcourues (calculé par Dijkstra)
void affiche_chemin(int dep,int arr,int P[nb_ville])
{
if(P[arr]!=dep)
{
affiche_chemin(dep,P[arr],P);
affiche_ville(P[arr]);
printf("->");
}


}


int appartient(S_maillon* T, int succ)
{
int res=0;

while(T->suiv!=NULL)
{
if(T->val==succ) res=1;
T=T->suiv;
}

return res;

}

int cherche_succes( int** succes, int* ville,int nb_ville)
{
int cpt;
int nb_succes=0;

for(cpt=0;cpt<nb_ville;cpt++)
{
if(ville[cpt]>0&&ville[cpt]<500)
{
(*succes)[nb_succes]=cpt;
nb_succes++;
}
else (*succes)[nb_succes]=-1;
}
return nb_succes;
}

//ALGORITHME DE DIJKSTRA
void dijkstra(int dep, int** tab, int nb_ville,int arr, char unite[3])
{

S_maillon *S,*T,*tempT,*tempS; //S=sommets parcourus T=sommets à parcourir
int marque[nb_ville],P[nb_ville]; //P=distance parcourue;
int cpt, nb_T=0;
int nb_suc,*successeur;

successeur=(int*)calloc(nb_ville,sizeof(int));

//initiation
S=(S_maillon*)calloc(1,sizeof(S_maillon));
S->val=dep;

T=(S_maillon*)calloc(1,sizeof(S_maillon));
tempT=T;
for(cpt=0;cpt<nb_ville;cpt++)
{
if(cpt!=dep)
{
tempT->val=cpt;
tempT->suiv=(S_maillon*)calloc(1,sizeof(S_maillon));
tempT=tempT->suiv;
nb_T++;
marque[cpt]=1000;
}
else marque[cpt]=0;
P[cpt]=-1;
}

nb_suc=cherche_succes(&successeur,tab[dep],nb_ville);


for(cpt=0;cpt<nb_suc;cpt++)
{
marque[successeur[cpt]]=tab[dep][successeur[cpt]];
P[successeur[cpt]]=dep;
}

//P=sommet precedent si marque <1000 -1 sinon

//iteration
tempS=S;

while(nb_T>0)
{
int sommet=-1;

//choisi un sommet dans T dont la marque est min
tempT=T;
sommet=tempT->val;
tempT=tempT->suiv;
for(cpt=0;cpt<nb_T-1;cpt++)
{
if(marque[tempT->val]<marque[sommet]) sommet=tempT->val;
tempT=tempT->suiv;
}

//ajoute le sommet dans S
tempS->suiv=(S_maillon*)calloc(1,sizeof(S_maillon));
tempS=tempS->suiv;
tempS->val=sommet;

//retire le sommet de T
tempT=T;
if(tempT->val!=sommet)
{
while(tempT->suiv->val!=sommet)
{
tempT=tempT->suiv;
}
tempT->suiv=tempT->suiv->suiv;
}
else *tempT=*(tempT->suiv);
nb_T--;

//cherche les successeurs du sommet
nb_suc=cherche_succes(&successeur,tab[sommet],nb_ville);

//pour tous les successeurs du sommet
for(cpt=0;cpt<nb_suc;cpt++)
{
//si le successeur appartient à T
if(appartient(T,successeur[cpt]))
{
//si le chemin est + court
if(marque[successeur[cpt]]>(marque[sommet]+tab[sommet][successeur[cpt]]))
{
//on affecte le nouveau chemin (marque et sommet precedent)
marque[successeur[cpt]]=(marque[sommet]+tab[sommet][successeur[cpt]]);
P[successeur[cpt]]=sommet;
}
}
}


}

printf("le chemin le plus court pour aller de ");
affiche_ville(dep);
printf(" a ");
affiche_ville(arr);
printf(" est de %d %s\n",marque[arr],unite);

printf("le chemin est ");
affiche_ville(dep);
printf("->");
affiche_chemin(dep,arr,P);
affiche_ville(arr);
printf("\n\n");
}




Cette discussion est classée dans : int, cpt, sommet, suiv, tempt


Répondre à ce message

Sujets en rapport avec ce message

exclusion d'un Intervalle dans un tableau ... [ par pirana ] Bonjour à tous , j'aimerais sauté un intervale dans un textevoici mon code je pense que ca sera plus explicite :)data[]={01234567ABCDEFLI01234567ABCDE sequance d alternance paire et impaire ds un tableau [ par Strick9 ] Bonjour à tousvoila je suis débutant et j'aimerai bien connaître la solution de cet énoncé. Soit un tableau d'entier. Une séquence paire est problème de char [ par minet03 ] Bonjour c'est encore le débutant, voilà le code :#include #include #include char inverser_char(char variable[]){ int longueur = strlen(variable); // l problème d'ouverture et de lecture d'un fichier [ par Trinity_vv ] J'ai fais un code d'ouverture et d'affichage d'un fichier, tout marchait très bien. Sans exagérer 10 minutes plus tard, je le régénére et il ne veut p Problème avec quick sort avec des chaines de caractères [ par bakka72 ] Bonjour,Je dois réalisé un quick sort de chaines et jai u souci .1er. je parcourt kle fichier a trié pour compter le nombre délément 2eme je crée un t Un pointeur qui disparait ! [ par benjiiim94 ] Bonjour, J'ai un gros problème avec un pointeur ! Je devellope une fonction qui recherche un mot dans un texte afin de stocker l'indice de début et d Projet en C++ [ par Hugo Dam ] Bonjour, Il se trouve que j'ai un projet en C++ et je suis complètement bloqué. Au moment de la compilation j'ai énormément d'erreur. Voici le sujet ; deplacement avec fleche directionnelle [ par dami13014 ] bonjours tout le monde voila je débute en programmation et j'ai fait un petit sudoku il et pa trés complex mais j'aimerai bien pouvoir me déplacer ave remplir aléatoirement une matrice binaire dynamique [ par amani20081984 ] bonjour, je veux bien remplir une matrice de structure dynamique d'une manière aléatoire par des valeurs 0 et 1 en utilisant la fonction rand(),voicii Pointeur int dans fonction récursive [ par sudoku1983 ] J'ai un problème pour récupérer un entier qui est paramètre d'une fonction récursive. Cette fonction


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,733 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales