2025-01-27 10:19:29 +01:00

4.2 KiB

TP Graphes 1 : Codage de graphes


Exercice 1 : Matrice d'adjacence

Un graphe sera représenté ici par une structure contenant un entier (son ordre), un entier booléen (orienté ou non), et son ensemble d'arêtes, représenté par sa matrice d'adjacence :

struct graphe{
  int ordre; // l'ordre du graphe
  int** adj; // la matrice d'adjacence, donnée par un double tableau dynamique
  int oriente; // vaut 0 si le graphe est non orienté, 1 sinon
};

typedef struct graphe graphe;

Question : Ecrire une fonction permettant de créer un graphe vide à partir de son ordre et de son orientation :

graphe creergraphe(int ord,int or);

La fonction devra entre autres réserver de la mémoire pour la matrice d'adjacence.

Question : Ecrire une fonction prenant un graphe et deux sommets, et ajoutant une arête entre ces deux sommets :

void ajoutArete(graphe g,int v,int w){

Question : Si le graphe est non orienté, toute arête de v vers w ajoute également une arête de w vers v. Modifiez la fonction précédente pour en prendre compte.

Question : Créez dans le main le graphe des frontières de la France (on ne considérera pas les micro-états).

Aide : Vous pouvez utiliser la fonction suivante pour afficher votre graph. Elle utilise la bibliothèque graphique de l'IUT. Il faut donc ajouter -lgraph lors de la compilation.

void visuelGraphe(graphe g){
	int taille=1000;
    int origine=taille/2;
    int distance=4*origine/5;
    int tailleVert=taille/20;
	    InitialiserGraphique();
    CreerFenetre(10,10,taille,taille);

    int i,j;
    int x,y;
    char* nV=malloc(2);
    *nV='0';
    *(nV+1)='\0';
    int* cX=calloc(g.ordre,sizeof(int));
    int* cY=calloc(g.ordre,sizeof(int));
    for(i=0;i<g.ordre;i++){
    	x=(int) origine+distance*cos(2*M_PI*i/g.ordre);
    	y=(int) origine+distance*sin(2*M_PI*i/g.ordre);
    	cX[i]=x+tailleVert/2;
    	cY[i]=y+tailleVert/2;
    	RemplirArc(x,y,tailleVert,tailleVert,0,360); 
    	EcrireTexte(x,y,nV,2);
    	(*nV)++;

    }

    for(i=0;i<g.ordre;i++){
    	    for(j=0;j<g.ordre;j++){
    	    	if(g.adj[i][j]!=0){
    	    		DessinerSegment(cX[i],cY[i],cX[j],cY[j]);
    	    	}
    	    }
    	}
    Touche();
    FermerGraphique();

}

Exercice 2 : Voisinage

Question : Ecrire une fonction permettant de d'afficher les voisins d'un sommet dans un graphe non orienté. Testez votre fonction sur le graphe créé au premier exercice.

Question : Modifiez votre fonction pour afficher les voisins sortants et les voisins entrants si le graphe est orienté.

Question : Ecrire une fonction comptant le nombre de voisins d'un sommet dans un graphe, en gérant les cas orienté ou non orienté.

Question : Vérifiez sur le graphe créé la propriété du cours :

La somme du nombre de voisins de tous les états est égal au nombre d'arêtes x 2.


Exercice 3 : Listes

Il est possible de coder l'ensemble des voisins d'un sommet par une liste chaînée. Pour cela, on utilise un codage des listes chaînées :

struct mail{
  int valeur;
  struct mail *suivant;
};

Ainsi que des fonctions les utilisant :

int tailleM(maillon *m){  //Renvoie la taille d'une liste
  int res=0;
  while(m!=NULL)){
    res++;
    m=m->suivant;
  }
  return res;
}

void affiche(maillon *m){  //Affiche le contenu d'une liste
  if(m==NULL){
    printf("\n");
  }else{
    printf("%d, ",m->valeur);
    affiche(m->suivant);
  }
}


maillon* ajouterDebut(maillon* m,int val){ //Renvoie la liste enrichie de val
  maillon* res=malloc(sizeof(maillon));
  res->valeur=val;
  res->suivant=m;
  return res;
}

int estDans(maillon* m,int val){ //Renvoie 0 si val n'est pas dans la liste, 1 sinon
  if(m==NULL){
    return 0;
  }
  if(m->valeur==val){
    return 1;
  }
  return estDans(m->suivant,val);
}

A partir de ces listes, on peut donc définir un graphe comme suit :

struct graphe{
  int ordre;
  maillon** voisins;
  int oriente;
};

Où voisins est un tableau de listes chaînées.

Question : Recréez les fonctions codées dans les exercices précédents en les adaptant à cet encodage de graphes. Normalement, vous devriez pouvoir utiliser la même fonction main pour tester votre code.