ok
This commit is contained in:
parent
854ff1bf2e
commit
37146c4762
96
TP/TP3.md
96
TP/TP3.md
@ -1,96 +0,0 @@
|
|||||||
TP Graphes 3 : Parcours et Coloration
|
|
||||||
============
|
|
||||||
|
|
||||||
Le TP est prévu pour être fait en utilisant le codage des graphes à l'aide de matrices d'adjacence.
|
|
||||||
Pour plus de clarté, vous pouvez utiliser un nouveau fichier, en copiant les structures et fonctions nécessaires depuis les TPs précédants.
|
|
||||||
|
|
||||||
- - - - -
|
|
||||||
Exercice 1 : Parcours en largeur
|
|
||||||
----------
|
|
||||||
|
|
||||||
Pour cet exercice, vous aurez besoin de file FIFO (First In, First Out).
|
|
||||||
Vous pouvez par exemple utiliser la classe [`LinkedList`](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/LinkedList.html), instanciée pour les entiers avec `LinkedList<Integer>`.
|
|
||||||
Pour utiliser une LinkedList en tant que file FIFO, vous pouvez utiliser les méthodes :
|
|
||||||
```
|
|
||||||
public boolean isEmpty() : Returns true if this collection contains no elements.
|
|
||||||
Integer remove() : Retrieves and removes the head (first element) of this list.
|
|
||||||
boolean offer(E e) : Adds the specified element as the tail (last element) of this list.
|
|
||||||
```
|
|
||||||
|
|
||||||
**Question :**
|
|
||||||
|
|
||||||
Ecrire une fonction qui, étant donnés un graphe g et un sommet v de ce graphe, renvoie sous forme de file FIFO l'ensemble des voisins de v dans g :
|
|
||||||
```
|
|
||||||
public LinkedList<Integer> getVoisins(int i);
|
|
||||||
```
|
|
||||||
|
|
||||||
![Parcours en Largeur](parcoursLargeur.png)
|
|
||||||
|
|
||||||
**Question :**
|
|
||||||
|
|
||||||
Ecrire une fonction effectuant le parcours en largeur d'un graphe g à partir d'un sommet v.
|
|
||||||
On pourra se contenter d'afficher sur la sortie standard la numérotation ainsi que les distances obtenues, plutôt que de les renvoyer :
|
|
||||||
```
|
|
||||||
public void parcoursLargeur(int v)
|
|
||||||
```
|
|
||||||
|
|
||||||
**Question :**
|
|
||||||
|
|
||||||
Tester sur un graphe (au hasard celui des frontières). Cela correspond-t-il à une exécution manuelle de l'algorithme ?
|
|
||||||
|
|
||||||
|
|
||||||
- - - - -
|
|
||||||
Exercice 2 : Parcours en profondeur
|
|
||||||
----------
|
|
||||||
|
|
||||||
Pour implémenter le parcours en profondeur d'un graphe, nous aurons besoin d'une pile.
|
|
||||||
La classe `LinkedList` permet également de simuler des piles, avec les méthodes :
|
|
||||||
```
|
|
||||||
public boolean isEmpty() : Returns true if this collection contains no elements.
|
|
||||||
Integer pop() : Pops an element from the stack represented by this list.
|
|
||||||
void push(int i) : Pushes an element onto the stack represented by this list.
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
**Question :**
|
|
||||||
|
|
||||||
Ecrire une fonction effectuant le parcours en profondeur d'un graphe g à partir d'un sommet v.
|
|
||||||
On pourra se contenter d'afficher sur la sortie standard la numérotation de premier passage plutôt que de les renvoyer :
|
|
||||||
```
|
|
||||||
public void parcoursProfondeur(int i);
|
|
||||||
```
|
|
||||||
|
|
||||||
![Parcours en Profondeur](parcoursProfondeur.png)
|
|
||||||
|
|
||||||
**Question :**
|
|
||||||
|
|
||||||
Tester sur un graphe (au hasard celui des frontières). Cela correspond-t-il à une exécution manuelle de l'algorithme ?
|
|
||||||
|
|
||||||
**Question :**
|
|
||||||
|
|
||||||
Adaptez votre code pour également calculer, puis afficher, la numérotation de dernier passage.
|
|
||||||
|
|
||||||
- - - - -
|
|
||||||
Exercice 3 : Algorithme de Welsh-Powell
|
|
||||||
----------
|
|
||||||
|
|
||||||
On va implémenter l'algorithme de Welsh-Powell de coloriage glouton des graphes.
|
|
||||||
Les premières questions visent à donner des fonctions aidant à l'implémentation de l'algorithme. A vous de les suivre ou non.
|
|
||||||
|
|
||||||
**Question : Liste des sommets selon leur degré**
|
|
||||||
|
|
||||||
-Créer une fonction `private int[] tableauDegre();` renvoyant un tableau où la case i contient le degré du sommet i.
|
|
||||||
|
|
||||||
-Créer une fonction `private int indiceMax(int[] tab);` renvoyant l'indice de la plus grande valeur du tableau tab.
|
|
||||||
|
|
||||||
-En utilisant les deux premières fonctions, créer une fonction `private LinkedList<Integer> listeDegre()` renvoyant une liste des sommets classés selon leur degré.
|
|
||||||
|
|
||||||
**Question**
|
|
||||||
|
|
||||||
![Algorithme de Welsh-Powell](WelshPowell.png)
|
|
||||||
|
|
||||||
**Question**
|
|
||||||
|
|
||||||
Enfin, implémentez l'algorithme de Welsh-Powell.
|
|
||||||
|
|
||||||
Indice : Vous aurez besoin de la liste des sommets triés selon leur degré. On peut retirer un élément i donné de la liste l avec `l.remove((Integer) i)`.
|
|
67
TP/TP4.md
67
TP/TP4.md
@ -1,67 +0,0 @@
|
|||||||
TP Graphes 4 : Plus Court Chemin et Arbre Recouvrant Minimal
|
|
||||||
============
|
|
||||||
|
|
||||||
Le TP est prévu pour être fait en utilisant le codage des graphes à l'aide de matrices d'adjacence.
|
|
||||||
Pour plus de clarté, vous pouvez utiliser une nouvelle classe, en copiant les structures et fonctions nécessaires depuis les TPs précédants.
|
|
||||||
|
|
||||||
|
|
||||||
- - - - -
|
|
||||||
Exercice 0 : Graphes valués
|
|
||||||
----------
|
|
||||||
|
|
||||||
Nous avons enrichi nos graphes avec une valuation des arêtes.
|
|
||||||
|
|
||||||
**Question :**
|
|
||||||
|
|
||||||
Comment intégrer cela à notre structure de données ?
|
|
||||||
|
|
||||||
|
|
||||||
Quel fonction(s) faut-il modifier pour prendre en compte cet enrichissement ?
|
|
||||||
|
|
||||||
**Question :**
|
|
||||||
|
|
||||||
Créez une nouvelle classe GraphesValues.java contenant la structure et les primitives nécessaires à la manipulation des graphes valués.
|
|
||||||
|
|
||||||
|
|
||||||
- - - - -
|
|
||||||
Exercice 1 : Algorithme de Dijkstra
|
|
||||||
----------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
L'algorithme de Dijkstra renvoie deux données : la fonction d donnant la distance minimale entre la source et un sommet, et la fonction père donnant la direction à prendre pour atteindre cette distance minimale.
|
|
||||||
|
|
||||||
**Question :**
|
|
||||||
|
|
||||||
Une fonction des sommets vers un entier (ou un autre sommet) sera représentée par un tableau où la case i contient la valeur de la fonction pour i.
|
|
||||||
|
|
||||||
Nous souhaitons cependant renvoyer deux fonctions. Comment modéliser cela ?
|
|
||||||
|
|
||||||
**Question :**
|
|
||||||
|
|
||||||
Implémentez l'algorithme de Dijsktra, que je redonne ci-dessous :
|
|
||||||
|
|
||||||
![Algorithme de Dijkstra](dijkstra.png)
|
|
||||||
|
|
||||||
|
|
||||||
**Question :**
|
|
||||||
|
|
||||||
Testez votre algorithme en reprenant le graphes des frontières avec des valuation de votre choix.
|
|
||||||
Vérifier à la main que l'algorithme effectue les bons calculs.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- - - - -
|
|
||||||
Exercice 2 : Algorithme de Prim
|
|
||||||
----------
|
|
||||||
|
|
||||||
Pour simplifier l'implémentation, on se contentera d'afficher sur la sortie standard les arêtes sélectionnées. On renverra tout de même la valuation totale de l'arbre couvrant.
|
|
||||||
|
|
||||||
![Algorithme de Prim](prim.png)
|
|
||||||
|
|
||||||
|
|
||||||
**Question :**
|
|
||||||
Implémentez l'algorithme de Prim. Il n'y a pas besoin de modéliser l'ensemble T puisque l'on va l'afficher sur la sortie standard tout au long de l'algorithme.
|
|
||||||
|
|
||||||
**Question :**
|
|
||||||
Testez et vérifiez votre implémentation sur un exemple, au hasard le graphe des frontières.
|
|
Binary file not shown.
Before Width: | Height: | Size: 97 KiB |
BIN
TP/dijkstra.png
BIN
TP/dijkstra.png
Binary file not shown.
Before Width: | Height: | Size: 67 KiB |
@ -1,85 +0,0 @@
|
|||||||
#include<graph.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
|
|
||||||
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)++;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//Version si le graphe est une matrice d'adjacence
|
|
||||||
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]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//Version à utiliser si le graph est un tableau de listes chaînées
|
|
||||||
/*
|
|
||||||
maillon* read;
|
|
||||||
for(i=0;i<g.ordre;i++){
|
|
||||||
read=g.voisins[i];
|
|
||||||
while(read!=NULL){
|
|
||||||
DessinerSegment(cX[i],cY[i],cX[read->valeur],cY[read->valeur]);
|
|
||||||
read=read->suivant;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
Touche();
|
|
||||||
FermerGraphique();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Aides matrices
|
|
||||||
//Creation matrice carrée vide :
|
|
||||||
int** creerMatriceId(int taille){
|
|
||||||
int** res=calloc(taille,sizeof(int*));
|
|
||||||
for(int i=0;i<taille;i++){
|
|
||||||
res[i]=calloc(taille,sizeof(int));
|
|
||||||
for(int j=0;j<taille;j++){
|
|
||||||
res[i][j]=(i==j)?1:0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Creation copie d'une matrice carree :
|
|
||||||
int** recopierMatrice(int **m,int taille){
|
|
||||||
int** creerMatriceId(int taille){
|
|
||||||
int** res=calloc(taille,sizeof(int*));
|
|
||||||
for(int i=0;i<taille;i++){
|
|
||||||
res[i]=calloc(taille,sizeof(int));
|
|
||||||
for(int j=0;j<taille;j++){
|
|
||||||
res[i][j]=m[i][j];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 104 KiB |
Binary file not shown.
Before Width: | Height: | Size: 88 KiB |
BIN
TP/prim.png
BIN
TP/prim.png
Binary file not shown.
Before Width: | Height: | Size: 85 KiB |
Loading…
Reference in New Issue
Block a user