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




//----------------------------------------------Structure  Kruskal ------------------------------------------------------
// Structures adaptées à partir de votre code
typedef struct arete {
    int sommet1;
    int sommet2;
    int poids;
} Arete;

typedef struct graphe {
    int nb_sommets;        // Nombre total de sommets dans le graphe.
    int nb_aretes;         // Nombre total d'arêtes dans le graphe.
    Arete* liste_aretes;   // Tableau d'arêtes.
} Graphe;

typedef struct noeudListe {
    Arete arete;
    struct noeudListe* successeur;
} NoeudListe;

typedef struct listeAretes {
    NoeudListe* tete;
} ListeAretes;



//----------------------------------------------Déclaration fonctions Kruskal ------------------------------------------------------
void Cree_graphe_oriente_a_partir_de_fichier(Graphe* G, const char* nomFichierGraphe);
int kruskal(Graphe* G, ListeAretes* foret);
void fusion(Arete* tab, int deb, int fin1, int fin);
void tri_fusion(Arete* tab, int deb, int fin);

//----------------------------------------------Kruskal ------------------------------------------------------

void Cree_graphe_oriente_a_partir_de_fichier_(Graphe* G, const char* nomFichierGraphe) {
    FILE *fichier = fopen(nomFichierGraphe, "r"); // Ouvre le fichier contenant les données du graphe en lecture.

    if (fichier != NULL) // Si le fichier a été ouvert avec succès...
    { 
        int nb_sommets, nb_aretes, sommet1, sommet2, poids;
        fscanf(fichier, "%d %d", &nb_sommets, &nb_aretes); // Lit le nombre total de sommets et d'arêtes du graphe.

        G->nb_sommets = nb_sommets; // Stocke le nombre de sommets dans la structure Graphe.
        G->nb_aretes = nb_aretes; // Stocke le nombre d'arêtes dans la structure Graphe.
        G->liste_aretes = (Arete*) malloc(nb_aretes * sizeof(Arete)); // Alloue de l'espace pour le tableau d'arêtes.

        for (int i = 0; i < nb_aretes; i++) 
        {
            fscanf(fichier, "%d %d %d", &sommet1, &sommet2, &poids); // Lit les informations de chaque arête: sommet de départ, d'arrivée et poids.
            
            // Stocke les informations dans le tableau d'arêtes
            G->liste_aretes[i].sommet1 = sommet1;
            G->liste_aretes[i].sommet2 = sommet2;
            G->liste_aretes[i].poids = poids;
        }
    } else {
        printf("Le fichier n'a pas été trouvé.\n"); // Affiche un message d'erreur si le fichier ne peut pas être ouvert.
    }

    if (fichier) fclose(fichier); // Ferme le fichier une fois le traitement terminé.
}

// Fonction de tri des arêtes par poids - à implémenter
void trierAretes(Arete* aretes, int nb_aretes) {
    // Utiliser un algorithme de tri, par exemple tri par fusion ou quicksort,
    // pour trier les arêtes par leur poids.
}

// Algorithme de Kruskal adapté



int kruskal(Graphe* G, ListeAretes* foret) {
    int* couleurs = (int*)malloc(G->nb_sommets * sizeof(int));
    int poidsTotal = 0;

    for (int i = 0; i < G->nb_sommets; i++) {
        couleurs[i] = i;
    }

    // Utilisation de tri_fusion au lieu de trierAretes
    tri_fusion(G->liste_aretes, 0, G->nb_aretes - 1);

    for (int i = 0; i < G->nb_aretes; i++) {
        int sommet1 = G->liste_aretes[i].sommet1;
        int sommet2 = G->liste_aretes[i].sommet2;
        int poids = G->liste_aretes[i].poids;

        if (couleurs[sommet1] != couleurs[sommet2]) {
            NoeudListe* noeud = (NoeudListe*)malloc(sizeof(NoeudListe));
            noeud->arete = G->liste_aretes[i];
            noeud->successeur = foret->tete;
            foret->tete = noeud;
            poidsTotal += poids;

            int nouvelleCouleur = couleurs[sommet1];
            for (int u = 0; u < G->nb_sommets; u++) {
                if (couleurs[u] == couleurs[sommet2]) {
                    couleurs[u] = nouvelleCouleur;
                }
            }
        }
    }

    free(couleurs);
    return poidsTotal;
}


//---------------------------------------------- Tri fusion kruskal ------------------------------------------------------

void fusion(Arete* tab, int deb, int fin1, int fin) {
    int taille = fin - deb + 1;
    Arete* temp = (Arete*)malloc(taille * sizeof(Arete));
    int i1 = deb, i2 = fin1 + 1, it = 0;

    while (i1 <= fin1 || i2 <= fin) {
        if (i2 > fin || (i1 <= fin1 && tab[i1].poids <= tab[i2].poids)) {
            temp[it++] = tab[i1++];
        } else {
            temp[it++] = tab[i2++];
        }
    }

    for (int i = 0; i < taille; i++) {
        tab[deb + i] = temp[i];
    }

    free(temp);
}

void tri_fusion(Arete* tab, int deb, int fin) {
    if (deb < fin) {
        int moitie = (deb + fin) / 2;
        tri_fusion(tab, deb, moitie);
        tri_fusion(tab, moitie + 1, fin);
        fusion(tab, deb, moitie, fin);
    }
}









int main() {
    Graphe G;
    ListeAretes foret = {NULL};

    // Exemple de création d'un graphe simple (remplacez ceci par la lecture d'un fichier si nécessaire)
    G.nb_sommets = 4; // Exemple avec 4 sommets
    G.nb_aretes = 5; // Exemple avec 5 arêtes
    G.liste_aretes = (Arete*)malloc(G.nb_aretes * sizeof(Arete));

    // Ajoutons quelques arêtes (sommet1, sommet2, poids)
    G.liste_aretes[0] = (Arete){0, 1, 10};
    G.liste_aretes[1] = (Arete){0, 2, 6};
    G.liste_aretes[2] = (Arete){0, 3, 5};
    G.liste_aretes[3] = (Arete){1, 3, 15};
    G.liste_aretes[4] = (Arete){2, 3, 4};

    // Appliquer l'algorithme de Kruskal
    int poidsTotal = kruskal(&G, &foret);

    printf("Poids total de la forêt couvrante minimale : %d\n", poidsTotal);

    // Nettoyage
    free(G.liste_aretes);
    while (foret.tete != NULL) {
        NoeudListe* tmp = foret.tete;
        foret.tete = foret.tete->successeur;
        free(tmp);
    }

    return 0;
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: