This commit is contained in:
Luc Dartois 2023-01-20 16:41:50 +01:00
parent 69826beb9b
commit 18c60aabb9

103
TP/TP1.md
View File

@ -1,12 +1,12 @@
#TP Graphes 1 : Codage de graphes TP Graphes 1 : Codage de graphes
============ ============
- - - - - - - - - -
##Exercice 1 : Matrice d'adjacence 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 : 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{ struct graphe{
int ordre; // l'ordre du graphe int ordre; // l'ordre du graphe
int** adj; // la matrice d'adjacence, donnée par un double tableau dynamique int** adj; // la matrice d'adjacence, donnée par un double tableau dynamique
@ -14,24 +14,109 @@ struct graphe{
}; };
typedef struct graphe graphe; typedef struct graphe graphe;
` ```
**Question :** **Question :**
Ecrire une fonction permettant de créer un graphe vide à partir de son ordre et de son orientation : Ecrire une fonction permettant de créer un graphe vide à partir de son ordre et de son orientation :
` ```
graphe creergraphe(int ord,int or); graphe creergraphe(int ord,int or);
` ```
La fonction devra entre autres réserver de la mémoire pour la matrice d'adjacence. La fonction devra entre autres réserver de la mémoire pour la matrice d'adjacence.
**Question :** **Question :**
Ecrire une fonction prenant un graphe et deux sommets, et ajoutant une arête entre ces deux sommets : 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){ void ajoutArete(graphe g,int v,int w){
` ```
**Question :** **Question :**
Si le graphe est non orienté, toute arête de v vers w ajoute également une arête de w vers v. 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. Modifiez la fonction précédente pour en prendre compte.
**Question :** **Question :**
Créez dans le main le graphe des frontières de la France (on ne considérera pas les micro-états). Créez dans le main le graphe des frontières de la France (on ne considérera pas les micro-états).
- - - - -
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 2 : 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(!listeVide(m)){
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 table 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.