begin process at 2012 02 07 08:35:46
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > ALGORITHME DE DJIKSTRA

ALGORITHME DE DJIKSTRA


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Classé sous :recherche operationnelle, theorie graphe, djisktra, arborescence, pois minimume Niveau :Débutant Date de création :22/07/2008 Date de mise à jour :23/07/2008 13:10:33 Vu / téléchargé :8 115 / 342

Auteur : mohtouati

Ecrire un message privé
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

ce programme est un tp de recherche operationnelle implemente le l'algorthme de Djikstra                                                                                                                                                                                                                                                          

Source

  • #include<stdio.h>
  • #include<conio.h>
  • #include <stdlib.h>
  • #include <time.h>
  • int n;
  • int t[20][20],p[20],arc[20][20],a[20],s[20],q,j,i,r,o,z,x;
  • long c;
  • int main()
  • {
  • time_t ti;
  • printf(" ===========================================================\n");
  • printf(" UNIVERSITE DE BEJAIA\n ");
  • printf(" DEPARTEMENT D'INFORMATIQUE \n ");
  • printf(" ETUDIANT : TOUATI MOHAMED \n ");
  • printf(" MODLE DE RECHERCHE OPERATIONNELLE\n");
  • printf(" ===========================================================\n");
  • printf(" ***bonjour***\n\n");
  • printf(" Algorithme de Djikstra :\n\n\n");
  • getch();
  • int clrscr();
  • printf(" ===========================================================\n");
  • printf(" UNIVERSITE DE BEJAIA\n ");
  • printf(" DEPARTEMENT D'INFORMATIQUE \n ");
  • printf(" ETUDIANT : TOUATI MOHAMED \n ");
  • printf(" MODULE DE RECHERCHE OPERATIONNELLE\n");
  • printf(" ===========================================================\n\n");
  • printf("introduire le nombre de sommet n \n\n");
  • printf("n=");
  • scanf("%d",&n);
  • a:
  • printf(" pour avoir la matrice manualement tappez '1' \n\n");
  • printf(" pour avoir la mtrice automatiquement tappez '2' \n");
  • scanf("%d",&q);
  • if(q!=1 && q!=2)
  • {
  • goto a;
  • }
  • if (q==1)
  • {
  • printf(" donnez maintenant les valeurs de la matrice:\n");
  • for(i=1;i<=n;i++)
  • {
  • for(j=1;j<=n;j++)
  • {
  • ref:
  • printf("X(%d,%d)=",i,j);
  • scanf("%d",&t[i][j]);
  • if (t[i][j]<0)
  • {
  • printf("error!!!\a\n");
  • printf("reffere l'introduction de la valeure de X(%d,%d)>=0\n",i,j);
  • goto ref;
  • }
  • }
  • }
  • }
  • else
  • {
  • srand((unsigned) time(&ti));
  • for(i=1;i<=n;i++)
  • {
  • for(j=1;j<=n;j++)
  • {
  • t[i][j]=(rand() % 10);
  • printf(" %d ",t[i][j]);
  • }
  • printf("\n\n\n");
  • }
  • }
  • getch();
  • for(i=1;i<=n;i++)
  • t[i][i]=0; ///pour eliminer les boucles
  • printf("---------------------------------------------------\n\n");
  • //clrscr();
  • for(i=1;i<=2;i++)
  • for(j=1;j<=2;j++) //initialisation de arc
  • arc[i][j]=0;
  • for(i=1;i<=n;i++) // initialiser les potenciels a l'infinit
  • p[i]=1000;
  • for(i=1;i<=n;i++)
  • a[i]=0;
  • for(i=1;i<=n;i++)
  • s[i]=0;
  • o=1; /// "o"la variable qui contien la racine
  • x=1;
  • zero:
  • if(o<=n)
  • {
  • s[x]=1;
  • p[x]=0;
  • z=1;
  • un:
  • for(i=1;i<=n;i++)
  • {
  • if((s[i]==0)&&(t[x][i]!=0))
  • {
  • if((p[x]+t[x][i])<p[i])
  • {
  • p[i]=p[x]+t[x][i];
  • a[i]=x; //extremité initiale "x" extremité terminale "i"
  • }
  • }
  • }
  • deux:
  • for(i=1;i<=n;i++)
  • {
  • if(s[i]==0)
  • {
  • z=i; //z est un sommet qui n'appartin pas a S
  • i=n;
  • }
  • }
  • for(i=1;i<=n;i++)
  • {
  • if((s[i]==0)&&(p[i]<p[z]))
  • {z=i;} //z est un sommet qui n'appartin pas a S mais de ptentieile minimume
  • }
  • if(p[z]==1000) ////si le ptontiel min est a l'infinit
  • { ////n'est pas une racine
  • for(i=1;i<=2;i++)
  • for(j=1;j<=2;j++)
  • arc[i][j]=0;
  • for(i=1;i<=n;i++)
  • p[i]=1000;
  • for(i=1;i<=n;i++)
  • a[i]=0;
  • for(i=1;i<=n;i++)
  • s[i]=0;
  • o=o+1;
  • x=o;
  • goto zero;
  • }
  • else
  • {
  • s[z]=1; ///introduire l'arc (a[z],z) dans l'arborecence
  • arc[(a[z])][z]=t[(a[z])][z];
  • x=z;
  • }
  • for(i=1;i<=n;i++)
  • {
  • if(s[i]==0)
  • {goto un;}
  • }
  • }
  • printf("l'arborecence de poid minimume avec la racine le sommet %d est:",o);
  • printf("\n\n\n");
  • for(i=1;i<=n;i++)
  • {
  • for(j=1;j<=n;j++)
  • {
  • printf(" %d ",arc[i][j]);
  • }
  • printf("\n\n\n");
  • }
  • printf("\n\n\n");
  • printf("la racine est: %d",o);
  • }
#include<stdio.h>
#include<conio.h>
#include <stdlib.h>
#include <time.h>
int n;
int t[20][20],p[20],arc[20][20],a[20],s[20],q,j,i,r,o,z,x;
long c;
int main()
{
time_t ti;
	 printf("    ===========================================================\n");
	 printf("                     UNIVERSITE DE BEJAIA\n ");
	 printf("                   DEPARTEMENT D'INFORMATIQUE \n ");
	 printf("            ETUDIANT : TOUATI MOHAMED \n ");
	 printf("               MODLE DE RECHERCHE OPERATIONNELLE\n");
	 printf("    ===========================================================\n");
	 printf("                             ***bonjour***\n\n");
	  printf("       Algorithme de Djikstra :\n\n\n");
	  getch();
	 int clrscr();
	 printf("    ===========================================================\n");
	 printf("                     UNIVERSITE DE BEJAIA\n ");
	 printf("                   DEPARTEMENT D'INFORMATIQUE \n ");
	 printf("            ETUDIANT : TOUATI MOHAMED \n ");
	 printf("               MODULE DE RECHERCHE OPERATIONNELLE\n");
	 printf("    ===========================================================\n\n");
printf("introduire le nombre de sommet n  \n\n");
printf("n=");
scanf("%d",&n);
a:
printf(" pour avoir la matrice manualement tappez '1'  \n\n");
printf(" pour avoir la mtrice automatiquement tappez '2'  \n");
  scanf("%d",&q);
if(q!=1 && q!=2)
  {
	 goto a;
  }
if (q==1)
{
printf(" donnez maintenant les valeurs de la matrice:\n");
	for(i=1;i<=n;i++)
		{
		  for(j=1;j<=n;j++)
			  {
				 ref:
				printf("X(%d,%d)=",i,j);
				scanf("%d",&t[i][j]);
				  if (t[i][j]<0)
					{
					 printf("error!!!\a\n");
					printf("reffere l'introduction de la valeure de X(%d,%d)>=0\n",i,j);
					 goto ref;
					 }
				}
		 }

}
else
{
srand((unsigned) time(&ti));
for(i=1;i<=n;i++)
	{
		 for(j=1;j<=n;j++)
			 {
			  t[i][j]=(rand() % 10);
			  printf("  %d    ",t[i][j]);
			  }
		 printf("\n\n\n");
	 }
 }
 getch();
	for(i=1;i<=n;i++)
		 t[i][i]=0;     ///pour eliminer les boucles

printf("---------------------------------------------------\n\n");
 //clrscr();

 for(i=1;i<=2;i++)
 for(j=1;j<=2;j++)  //initialisation de arc
  arc[i][j]=0;

 for(i=1;i<=n;i++)  // initialiser les potenciels a l'infinit
  p[i]=1000;

	for(i=1;i<=n;i++)
  a[i]=0;

  for(i=1;i<=n;i++)
  s[i]=0;
 o=1;                  /// "o"la variable qui contien la racine
 x=1;

zero:

	if(o<=n)
	  {
	  s[x]=1;
	  p[x]=0;
	  z=1;
un:
	for(i=1;i<=n;i++)
		{
		  if((s[i]==0)&&(t[x][i]!=0))
			 {
				if((p[x]+t[x][i])<p[i])
				  {
				  p[i]=p[x]+t[x][i];
				  a[i]=x;      //extremité initiale "x" extremité terminale "i"
				  }
			 }
		}
deux:
  for(i=1;i<=n;i++)
	 {
	  if(s[i]==0)
		{
		 z=i;    //z est un sommet qui n'appartin pas a S
		 i=n;
		}
  }

for(i=1;i<=n;i++)
{
if((s[i]==0)&&(p[i]<p[z]))
{z=i;}  //z est un sommet qui n'appartin pas a S mais de ptentieile minimume
}


if(p[z]==1000)      ////si le ptontiel min est a l'infinit
{                   ////n'est pas une racine
 for(i=1;i<=2;i++)
 for(j=1;j<=2;j++)
  arc[i][j]=0;

 for(i=1;i<=n;i++)
  p[i]=1000;

	for(i=1;i<=n;i++)
  a[i]=0;

  for(i=1;i<=n;i++)
  s[i]=0;
  o=o+1;
 x=o;
 goto zero;
}
  else
	{
	s[z]=1;                 ///introduire l'arc (a[z],z) dans l'arborecence
	arc[(a[z])][z]=t[(a[z])][z];
	x=z;
	}
	for(i=1;i<=n;i++)
	 {
	  if(s[i]==0)
	  {goto un;}
	 }
}
printf("l'arborecence de poid minimume avec la racine le sommet %d est:",o);
printf("\n\n\n");
for(i=1;i<=n;i++)
	{
		 for(j=1;j<=n;j++)
			 {
			  printf("  %d    ",arc[i][j]);
			  }
		 printf("\n\n\n");
	 }
	printf("\n\n\n");
	printf("la racine est: %d",o);
}

 Conclusion

universté de bejaia
j'ai créé ce code ya deux ans pour mon tp de recherche operationnelle Djikstra -ford merci pour les remarques je prendrai en copte  a  la venire

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

22 juillet 2008 02:18:50 :
enlevé la capture
23 juillet 2008 13:10:33 :
prise en compte de quelque remarques

 Sources du même auteur

Source avec Zip ANALYSEUR LEXICAL POUR UN COMPILATEUR ALGORITHMIQUE
Source avec Zip Source avec une capture LA FERMETURE TRANSITIVE
Source avec Zip Source avec une capture COMPOSENTE CONNEXES D'UN GRAPHE
Source avec Zip LES ENCHÈRES

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

EXPLORATEUR DE FICHIERS WINDOWS EN C par wildhawk
Source avec Zip Source avec une capture LA FERMETURE TRANSITIVE par mohtouati
Source avec Zip Source avec une capture COMPOSENTE CONNEXES D'UN GRAPHE par mohtouati
Source avec Zip Source avec une capture SHELL TREEVIEW (WIN32) par vecchio56

Commentaires et avis

Commentaire de WorldDMT le 22/07/2008 22:22:03

salut

dans la ligne N° 8 void main()

c'est pas "void main()" c'est plutot "int main()" et le "clrscr();" dans la "int main" ça doit etre "int clrscr();"

Commentaire de SAKingdom le 22/07/2008 22:43:57

"c'est pas "void main()" c'est plutot "int main()""
Ce n'est pas très grave.

"le "clrscr();" dans la "int main" ça doit etre "int clrscr();""
Hein ??? Tu repostes la même chose sur chacune de ses sources. Pourquoi veux tu remplacer un appel de fonction par un prototype ? L'appel de clrscr est justifié ici. Il efface l'affichage d'intro.

Aussi je vois partout dans le code (pareil pour tes autres sources d'ailleurs):
for(i=1;i<=n;i++)

C'est voulu ? Parce que sinon, depuis quand un tableau commence à l'index 1 et se termine à l'index nombre_delements_total ?

Commentaire de Chavenay le 23/07/2008 10:03:37

Bonjour, le nom djickstra est mal orthographié. C'est Dijkstra.

Commentaire de Cyberboy2054 le 23/07/2008 14:01:21

Un projet d'école avec des goto ?
surprenant...
D'ailleurs ce code fourmille de trucs amusants (genre t'as du mal avec l'orthographe de dijkstra, o=o+1...)

Par contre ca c'est n'importe quoi:
# a:
# printf(" pour avoir la matrice manualement tappez '1' \n\n");
# printf(" pour avoir la mtrice automatiquement tappez '2' \n");
# scanf("%d",&q);
# if(q!=1 && q!=2)
# {
# goto a;
# }
Jveux bien admettre que goto ca puisse etre parfois envisagé dans de tres rares cas (et encore) mais si tu veux l'utiliser partout fais du basic plutot...
int q = -1;
while (q != 1 && q != 2)
{
// note les corrections d'orthographe au passage.
// Si c'est un truc que tu dois rendre, j'imagine que les profs préfèrent une orthographe correcte...
// D'ailleurs la c'est même pas une question d'orthographe mais de relecture
   printf(" pour avoir la matrice manuellement tapez '1' \n\n");
   printf(" pour avoir la matrice automatiquement tapez '2' \n");
   scanf("%d",&q);
}

Commentaire de SAKingdom le 23/07/2008 21:58:11

do/while

int q;
do {
   printf(" pour avoir la matrice manuellement tapez '1' \n\n");
   printf(" pour avoir la matrice automatiquement tapez '2' \n");
   scanf("%d", &q);
} while(q != 1 && q != 2);

Commentaire de BruNews le 24/07/2008 14:01:10 administrateur CS

Tabou anti goto amène à tester q plusieurs fois, quel bennef...

...
while(q != 1 && q != 2);
on ne sait toujours pas sur quel traitement aller, faut retester q.

choix:
printf(" pour avoir la matrice manuellement tapez '1' \n\n");
printf(" pour avoir la matrice automatiquement tapez '2' \n");
scanf("%d", &q);
if(q == 1) goto manu;
if(q != 2) goto choix;
// ICI TRAITEMENT choix 2
....
manu:
....

Les tabous, faut les laisser aux sectes.

Commentaire de WorldDMT le 24/07/2008 16:11:31

printf("n=");
scanf("%d",&n);
a:
...

et si ce qu'on a mi c'est pas un numero??

il faut verifié si &n est 0-9

Commentaire de SAKingdom le 24/07/2008 19:11:37

Ce n'est pas un caractère que l'on test ici mais un entier. Sera TOUJOURS numérique peu-importe que l'utilisateur entre 3 ou 'a'. Si l'utilisateur entre 'a', la valeur sera simplement la représentation numérique du caractère 'a' qui, de toute façon, ne passera pas le test de confirmation. Ce qu'il faut tester ici c'est si les bornes sont respectées (entre 0 et 19 étant donnée que la matrice est de 20 par 20).

Cependant, je le redis encore:
for(i=1;i<=n;i++)
À moins que ce ne soit voulu (je ne vois nul part où sont utilisées les cases t[0][x] ni t[x][0], même chose pour tout les autres tableau d'ailleurs), un tableau commence toujours à l'index 0 et se termine à nombre_delement_total-1 donc:
for(i=0;i<n;i++)

Commentaire de SAKingdom le 24/07/2008 19:16:49

"ne passera pas le test de confirmation"

Quand je parle du test de confirmation ici, je parle du test pour confirmer que le nombre entré est entre 0 et 19 (la représentation entière de 'a' étant 97, (menfin la représentation... ce que vaut réellement 'a') ça ne passera logiquement pas).

Commentaire de WorldDMT le 24/07/2008 19:47:04

oui t'a raison SAKingdom
si on met 0 ça donnera rien et si tu ne met pas un chiffre tu met un a ou * t'as essayé?

Commentaire de SAKingdom le 24/07/2008 20:10:22

scanf("%d", &n) ne peut qu'accepter un nombre. Si ce n'est pas un nombre, la valeur de n avant l'appel sera conservé.
Suffit donc d'initialiser n à -1 par exemple. Ça ne passera pas le test des bornes et un nouveau nombre sera redemandé, si dans une boucle.
Toujours aucun besoin de test supplémentaire.
Maintenant, si l'utilisateur entre une chaine comme suit: 12%?231, seul les premiers caractères seront prit. Si on tien compte de ce cas, un test sur l'ensemble de la chaine peut devoir s'appliquer. Cependant, sur un projet relativement modeste ou spécialisé (qui n'a pas à traiter ce genre de chose), ce genre de test n'est pas très important, car, de toute façon, si le nombre créé par les premiers caractères dépasse les bornes, ça ne passera toujours pas le test donc aucun débordement tampon possible (résultat (peut-être) faussé cependant).

Ensuite, un caractère, quel qu'il soit vaut toujours une valeur numérique/hexadécimal étant donnée que c'est ce qu'il est. Entre '*' 'a' '$' ou ce que tu veux à la saisie, tu pourras toujours l'utiliser en tant que valeur numérique.
Coté ergonomique (pour l'utilisateur), je te l'accorde, ce n'est pas très chic mais coté logiciel, on s'en fout.

Commentaire de Cyberboy2054 le 25/07/2008 13:33:14

Brunews:
On s'en fout un peu du cycle perdu, c'est vraiment pas dans une portion critique du code.
Par contre du code chiant à lire, je trouve ca plus critique.
C'est vrai que quelque chose comme
if (q==1) // traitement 1
else if (q==2) // traitement 2
else {
printf/scanf
}
aurait été un poil meilleur, mais bon l'idée c'était surtout de pas écrire de goto la ou un if/else aurait suffit..

Mais je connais ton opinion la dessus, pas la peine de continuer le débat sur un sujet ou chacun à des arguments ...

Commentaire de ootbtdkg2 le 20/09/2008 14:39:43

slt,
je voudrais te demander si l'algorithme de djikstra tient compte des cycles possibles dans les suites d'arcs à 2 sommets en cycles multiples co-cycliques ou non ?
parce que je suis en train de présenter la résolution totale de matrices quelconques quelquesoit les fonctionneles ou équations indéterminées présentes; en rapport avec la résolution de nombreux problèmes dont notamment le jeu d'échecs! et je développe présentement ! un algorithme et un code source pour le calcul de toutes les positions au jeu d'échecs en tenant compte des matrices et non de l'allocation dynamique contiguë de mémoire qui de ce fait de contigüité n'est pas optimale étant entendu que la mémoire allouable max pour un processus reste équivalente !!!!! de plus ! l'aspect visuel directement représentable des matrices permet plus facilement de déterminer les commutativités, asymétries, cycles ou itérations redondantes plus aisément !!!!! surtout lorque l'on est en mode manuel !!!!! avec retour de la commande shell au programmeur pour décision litigieuse !!!!! à résoudre !!!!!
confère mes pages à ootbtdkg2 pour plus d'infos !!!!!
cordialement,
considérations,
didkac

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

arborescence [ par Neoxeo ] voila je sui tout nouveau sur ce site alor Bijour bon voila mon pb...je dois, pour un programme, creer un objet graphique sous c++ builder 4 afin de f Parcourir une arborescence en C [ par HCJarod ] Salut, je voudrai savoir comment en utilisant les fonction findfirst() et findnext() du C trouver tous les fichiers d'extension .exe. Je mexplique : l arborescence d'un HD [ par Galerien ] Bonjour à tous les dingues de la programmation en C,débutant dans la programmation en C sur PC, je souhaiterai inclure dans mon bout de code l'équival lister une arborescence de repertoire [ par krater ] bonjour, je souhaite réaliser un programme en C sous unix/linux qui rentre dans un fichier texte la liste des fichier du repertoir passer en parametre CFileDialog améliorée ? [ par bzouli ] Bonjour,Je voudrais faire un CFileDialog mais avec un Tree Control qui n'affiche que les dossiers de l'arborescence, et une Clist (à coté) où les fic Comment afficher un scan de tous les disques du pc dans une arborescence? [ par champista ] bijou,Voila, je suis un débutant en c++.Je travaille sous visual c++ 6.J'aimerais créer une arborescence qui affiche tous les disques et dossiers d'un PB d'affichage des sous dossier dans une arborescence? [ par champista ] Salut, Mon but est de cr&#233;er une interface du type mfc avec:-une arborescence des disques+dossiers-une fenetre 'contenu du dossier' contenant sous Pb sur "arborescence de dossier" [ par TahitiLove ] Bonjour,J'ai cr&#233;&#233; un projet MFC.&nbsp;Ce que j'aimerai ce serait de rajouter l'affichage d'une arborescence de dossier dans la fen&#234;tre Obtenir arborescence des dossiers virtuels de mon FTP [ par melkiorlenecrarque ] Bonjour,Existe-t-il une fonction api win32, semblable &#224; SHBrowseForFolder pour selectionner un dossier virtuel sur mon serveur FTP ?Autre questio arborescence de fichiers [ par otofraise ] Bonjour,J'aimerais savoir s'il existe un composant qui permet d'obtenir l'arborescence des repertoires/fichiers d'une machine, qui possede en racine l


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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 : 1,092 sec (3)

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