-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdijkstra.c
99 lines (77 loc) · 2.19 KB
/
dijkstra.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include<stdio.h>
#include<conio.h>
#define INFINI 9999
#define MAX 20
void dijkstra(int G[MAX][MAX], int n, int sommet_depart);
int main() {
int G[MAX][MAX],i,j,n,u;
printf("Entrer le nombre de sommets : ");
scanf("%d",&n);
printf("\nEntrer la matrice d'adjacence : \n");
for(i=0; i<n; i++)
for(j=0; j<n; j++)
scanf("%d", &G[i][j]);
printf("\nEntrer le sommets de depart : ");
scanf("%d", &u);
u--;
dijkstra(G, n, u);
return 0;
}
void dijkstra(int G[MAX][MAX], int n, int sommet_depart) {
int dijkstra[MAX][MAX], longueurs[MAX], chemins[MAX];
int visite[MAX], nb, min_longueur, sommet_suivant, i, j;
// copie la matrice d'adjacence dans dijikstra
// et remplace les 0 par l'INFINI
for(i=0; i<n; i++)
for(j=0; j<n; j++)
if(G[i][j] == 0)
dijkstra[i][j] = INFINI;
else
dijkstra[i][j] = G[i][j];
// initialise chemins[], longueurs[] and visite[]
for(i=0; i<n; i++) {
// initialise longueurs par la premiere ligne
longueurs[i] = dijkstra[sommet_depart][i];
// initialise chemins par le sommet de depart
chemins[i] = sommet_depart;
// zero c-a-d n'est pas encore visité
visite[i] = 0;
}
// longueur vers le meme sommet est nulle
longueurs[sommet_depart] = 0;
// le sommet de depart est déjà visité
visite[sommet_depart] = 1;
// donc on commence à 1
nb=1;
while(nb < n-1) {
min_longueur = INFINI;
// on trouve le minimum de chaque ligne
// on a l'indice du minimum dans sommet_suivant
for(i=0; i<n; i++)
if(longueurs[i] < min_longueur && !visite[i]) {
min_longueur = longueurs[i];
sommet_suivant = i;
}
// Le sommet est devenu maintenant visité
visite[sommet_suivant] = 1;
// Vérifier si un meilleur chemin existe à travers sommet_suivant
for(i=0; i<n; i++)
if(!visite[i])
if(min_longueur + dijkstra[sommet_suivant][i] < longueurs[i]) {
longueurs[i] = min_longueur + dijkstra[sommet_suivant][i];
chemins[i] = sommet_suivant;
}
nb++;
}
// Affichage des chemins
for(i=0; i<n; i++)
if(i != sommet_depart) {
printf("\nDistance vers %d est %d", i+1, longueurs[i]);
printf("\nChemin vers %d", i+1);
j=i;
do {
j = chemins[j];
printf(" <- %d", j+1);
} while(j != sommet_depart);
}
}