////////////////////////////////////////////
    //
    // structure.h
    //
    // Structure de données pour stocker
    // un graphe en mémoire.
    //
    // Michaël ORTEGA & Nicolas DUMOULIN
    // Projet de Graphe - Mai 2001
    //
    ////////////////////////////////////////////


#include <iostream> 
#include <string> 
#include <sys\timeb.h> 

using namespace std; 

#ifndef visualcpp 
    #ifndef autres_compilos 
        #define visualcpp 
    #endif 
#endif 

#define infini 30000 

class list_sommet; 

/////////////////// classe sommet /////////////////////////////////

class sommet       
/* chaque sommet contient une liste de successeur et son numéro dans le graph.*/
{     
    unsigned int code;            //numéro du sommet
    list_sommet * succ;            //liste des successeurs

public
//constructeurs et destructeur
    sommet(){succ=NULL;} 
    sommet(unsigned int c):code(c) {succ=NULL;} 
    ~sommet(){ supprime_liste();} 
//suppression de la liste des successeurs de la mémoire
    void supprime_liste(); 
//ajout d'un successeur dans la liste du sommet
    void ajout_liste(sommet * s,const unsigned int p); 
//affichage du numéro du sommet ainsi que de ses successeurs
    void affiche() const; 
//renvoie si le sommet a pour successeur le sommet dont le numéro est passé en paramètre
    int a_pour_succ(const unsigned int c) const; 
//partage des données avec la classe graph
    friend class graph; 
}; 

/////////////////// classe list_sommet ////////////////////////////

class list_sommet 
/*chaque élément de la liste de sommet contient le poids de l'arc entre le sommet qui génère la liste et le sommet dont l'adresse est stockée dans l'attribut "contenu"*/

    int poids;                //poids de l'arc
    sommet * contenu;        //pointeur sur le sommet correspondant
    list_sommet * suivant;    //suivant dans la liste
public
//partage des données avec les classes graph et sommet
    friend class sommet; 
    friend class graph; 
}; 

/////////////////// classe graph //////////////////////////////////

class graph 

    unsigned int nbs;            //nombre de sommets du graph
    sommet * tabsommet;    //tableau de sommets du graph
public
//constructeurs et destructeur
    graph():nbs(0){} 
    graph(const unsigned int n) : nbs(n) { tabsommet = new sommet [n]; 
                            for (unsigned int i=0;i<n;i++) tabsommet[i].code=i;} 
    ~graph() { if (nbs>0) delete [] tabsommet; } 
//affichage du graphe : liste des sommets et de leurs successeurs
    void affiche() const; 
//formation d'un arc de poids p, du sommet d au sommet a
    void ajout_succ(const unsigned int d,const unsigned int a,const unsigned int p);  
//on test si S a tous ses sommets marqués
    int test(const unsigned int * s) const; 
//algorithme de Dijkstra
    graph * dijkstra(unsigned long int & temps) const; 
//chargement d'un garphe à partir d'un fichier
    void charger(); 
//enregistrement d'un graphe dans un fichier
    void enregistrer() const; 
//propose à l'utilisateur d'afficher en d'enregistrer un graphe
    void sortie_graphe(); 
//génération aléatoire de graphe ayant n sommets
    void hasard(const unsigned int n,const unsigned int proba); 
//verifie si un graphe est connexe en utilisant un parcours en largeur, et dans le cas échéant le rend connexe
//renvoie un si une correction a été apportée
    int connexe();
};