Online C Compiler
Ouvrir dans le compilateur

Édition pédagogique en français

Algorithme de Dijkstra en C

Calculez les distances minimales depuis une origine dans un graphe à poids non négatifs.

Ouvrir dans le compilateur

Algorithme de Dijkstra en C
Calculez les distances minimales depuis une origine dans un graphe à poids non négatifs.

Initialisez la distance de l’origine à zéro et les autres à inconnu ou infini. Choisissez le sommet non visité de distance minimale et relâchez ses arêtes : mettez à jour une distance si passer par ce sommet l’améliore.

Dijkstra exige des poids non négatifs. Distinguez une arête absente d’une arête de poids zéro selon la représentation. N’ajoutez pas un poids à la valeur représentant l’infini et surveillez les débordements.

La version avec matrice et sélection linéaire coûte généralement O(V²). Testez des sommets inaccessibles et des chemins alternatifs. Les poids négatifs nécessitent un autre algorithme.

Code source

#include <stdio.h>
#include <stdbool.h>
#include <limits.h>

#define V 5

int minDistance(int dist[], bool sptSet[]) {
    int min = INT_MAX, min_index = -1;
    for (int v = 0; v < V; v++) {
        if (!sptSet[v] && dist[v] <= min) {
            min = dist[v];
            min_index = v;
        }
    }
    return min_index;
}

void dijkstra(int graph[V][V], int src) {
    int dist[V];
    bool sptSet[V];

    for (int i = 0; i < V; i++) {
        dist[i] = INT_MAX;
        sptSet[i] = false;
    }

    dist[src] = 0;

    for (int count = 0; count < V - 1; count++) {
        int u = minDistance(dist, sptSet);
        sptSet[u] = true;

        for (int v = 0; v < V; v++) {
            if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX
                && dist[u] + graph[u][v] < dist[v]) {
                dist[v] = dist[u] + graph[u][v];
            }
        }
    }

    printf("Vertex 	 Distance from Source (%d)\n", src);
    for (int i = 0; i < V; i++) printf("%d 		 %d\n", i, dist[i]);
}

int main() {
    int graph[V][V] = {
        {0, 4, 0, 8, 0},
        {4, 0, 8, 11, 0},
        {0, 8, 0, 7, 2},
        {8, 11, 7, 0, 9},
        {0, 0, 2, 9, 0}
    };
    dijkstra(graph, 0);
    return 0;
}
Ouvrir dans le compilateur

Résultat attendu

Vertex 	 Distance from Source (0)
0 		 0
1 		 4
2 		 12
3 		 8
4 		 14

Questions fréquentes

Pourquoi le code et certains résultats restent-ils en anglais ?

Les mots-clés C, les identifiants, les commentaires du programme et les sorties attendues restent ceux de la version originale pour conserver un code exécutable et des tests cohérents. Les explications et les consignes sont traduites.