xxxxxxxxxx
### Exercice 1
<img src="https://progalgo.fr/images/graphes_exos_1.png" style="width:300px;">
Concernant le graphe ci-dessus :
- Combien de sommets comporte-t-il ?
- Combien d'arcs comporte-t-il ?
- Est-il orienté ?
- Quels sont les voisins de F ?
- Donner trois chemins différents allant de A jusqu'à E.
- Donner un cycle.
- Donner un exemple de chemin simple et élémentaire.
- Donner un exemple de chemin ni simple ni élémentaire.
- Donner un exemple de chemin simple mais non élémentaire.
- Ce graphe est-il connexe ?
- Ce graphe est-il fortement connexe ?
Concernant le graphe ci-dessus :
xxxxxxxxxx
<details>
<summary style="border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan"> Solution </summary>
<div style="border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan">
- il comporte 6 sommets,
- il comporte 11 arcs,
- oui il est orienté,
- les voisins de F sont les sommets E et D,
- voici trois chemins possibles :
- A --> F --> E,
- A --> D --> E,
- A --> C --> F --> D --> E,
- un cycle : E --> B --> D --> E,
- un chemin simple et élémentaire : A --> F --> E --> D,
- un chemin ni simple, ni élémentaire : A --> F --> E --> D --> F --> E --> B,
- un chemin simple mais non élémentaire : C --> F --> D --> F --> E,
- oui ce graphe est connexe,
- non ce graphe n'est pas fortement connexe : par exemple il n'existe pas de chemin partant du sommet B et arrivant au sommet A.
</div>
</details>
xxxxxxxxxx
### Exercice 2
<img src="https://progalgo.fr/images/graphes_exos_2.png" style="width:300px;">
Concernant le graphe ci-dessus :
- Combien de sommets comporte-t-il ?
- Combien d'arcs comporte-t-il ?
- Est-il orienté ?
- Quels sont les voisins de F ?
- Donner trois chemins différents allant de A jusqu'à E.
- Donner un cycle.
- Donner un exemple de chemin simple et élémentaire.
- Donner un exemple de chemin ni simple ni élémentaire.
- Donner un exemple de chemin simple mais non élémentaire.
- Ce graphe est-il connexe ?
- Ce graphe est-il fortement connexe ?
Concernant le graphe ci-dessus :
xxxxxxxxxx
<details>
<summary style="border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan"> Solution </summary>
<div style="border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan">
- il comporte 9 sommets,
- il comporte 15 arcs,
- oui il est orienté,
- les voisins de F sont les sommets C, E et Z,
- voici trois chemins possibles :
- A --> F --> E,
- A --> F --> Z --> G --> F --> E,
- A --> F --> Z --> G --> E,
- un cycle : A --> F --> E --> D --> A,
- un chemin simple et élémentaire : A --> F --> E --> D,
- un chemin ni simple, ni élémentaire : G --> F --> E --> D --> A --> F --> E --> B,
- un chemin simple mais non élémentaire : G --> F --> E --> D --> A --> F --> Z,
- oui ce graphe est connexe,
- oui ce graphe est fortement connexe : quels que soient les sommets de départ et d'arrivée, on peut trouver un chemin reliant le départ à l'arrivée.
</div>
</details>
xxxxxxxxxx
### Exercice 3
Les trois graphes ci-dessous sont-ils identiques ?
| Graphe n°1 | Graphe n°2 | Graphe n°3 |
|:--------------------:|:-----------:|:--------------:|
| <img src="https://progalgo.fr/images/graphes_exos_3.png" style="width:100px;"> | <img src="https://progalgo.fr/images/graphes_exos_4.png" style="width:200px;"> | <img src="https://progalgo.fr/images/graphes_exos_5.png" style="width:300px;"> |
xxxxxxxxxx
<details>
<summary style="border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan"> Solution </summary>
<div style="border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan">
Oui ils sont identiques : les sommets sont les mêmes et les arcs reliant les différents sommets sont identiques d'un graphe à l'autre.
</div>
</details>
Oui ils sont identiques : les sommets sont les mêmes et les arcs reliant les différents sommets sont identiques d'un graphe à l'autre.
xxxxxxxxxx
### Exercice 4
Donner un exemple de graphe orienté fortement connexe comportant 5 sommets et moins de 10 arcs.
Est-ce possible avec strictement moins de 6 arcs ?
Donner un exemple de graphe orienté fortement connexe comportant 5 sommets et moins de 10 arcs.
Est-ce possible avec strictement moins de 6 arcs ?
xxxxxxxxxx
<details>
<summary style="border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan"> Solution </summary>
<div style="border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan">
Avec moins de dix arcs : <img src="https://progalgo.fr/images/graphes_exos_91.png" style="width:100px;">
Avec seulement cinq arcs : <img src="https://progalgo.fr/images/graphes_exos_92.png" style="width:100px;">
</div>
</details>
Avec moins de dix arcs :
Avec seulement cinq arcs :
xxxxxxxxxx
### Exercice 5
<img src="https://progalgo.fr/images/graphes_exos_6.png" style="width:200px;">
Concernant le graphe ci-dessus :
- Est-il orienté ?
- Donner trois chemins différents allant de 2 jusqu'à 5.
- Donner un cycle.
- Donner un exemple de chemin simple et élémentaire.
- Donner un exemple de chemin ni simple ni élémentaire.
- Donner un exemple de chemin simple mais non élémentaire.
- Ce graphe est-il connexe ?
Concernant le graphe ci-dessus :
xxxxxxxxxx
<details>
<summary style="border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan"> Solution </summary>
<div style="border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan">
- non il n'est pas orienté,
- voici trois chemins possibles :
- 2 --> 4 --> 1 --> 5,
- 2 --> 6 --> 1 --> 5,
- 2 --> 6 --> 4 --> 1 --> 3 --> 5,
- voici un cycle : 6 --> 1 --> 4 --> 6,
- voici un exemple de chemin simple et élémentaire : 2 --> 4 --> 1 --> 5,
- voici un exemple de chemin ni simple ni élémentaire : 2 --> 4 --> 1 --> 6 --> 4 --> 1 --> 3,
- voici un exemple de chemin simple mais non élémentaire : 6 --> 1 --> 5 --> 3 --> 1 --> 4,
- oui ce graphe est connexe.
</div>
</details>
xxxxxxxxxx
### Exercice 6
Donner un exemple de graphe orienté comportant 6 sommets et 6 composantes connexes.
Donner un exemple de graphe orienté comportant 6 sommets et 6 composantes connexes.
xxxxxxxxxx
<details>
<summary style="border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan"> Solution </summary>
<div style="border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan">
Il suffit que les six sommets ne soient reliés à aucun des autres sommets :
<img src="https://progalgo.fr/images/graphes_exos_93.png" style="width:200px;">
</div>
</details>
Il suffit que les six sommets ne soient reliés à aucun des autres sommets :
xxxxxxxxxx
### Exercice 7
Dessiner tous les graphes **non orientés** ayant exactement trois sommets.
Dessiner tous les graphes non orientés ayant exactement trois sommets.
xxxxxxxxxx
<details>
<summary style="border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan"> Solution </summary>
<div style="border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan">
```python
A
B C
A A A
/ \
B C B C B --- C
A A A
/ \ \ /
B C B --- C B --- C
A
/ \
B --- C
```
</div>
</details>
A
B C
A A A
/ \
B C B C B --- C
A A A
/ \ \ /
B C B --- C B --- C
A
/ \
B --- C
xxxxxxxxxx
### Exercice 8
Combien y a-t-il de graphes **orientés** ayant exactement trois sommets ?
Combien y a-t-il de graphes orientés ayant exactement trois sommets ?
xxxxxxxxxx
<details>
<summary style="border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan"> Solution </summary>
<div style="border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan">
Sur un graphe orienté à trois sommets, il y a potentiellement six arcs.
Par exemple, si le graphe comporte trois sommets A, B et C il y a les six arcs potentiels suivants :
```python
A --> B B --> A A --> C C --> A B --> C C --> B
```
Un graphe orienté à trois sommets est donc défini par la présence, ou l'absence, de chacun de ces six arcs potentiels. Un tel graphe peut donc être modélisé par une séquence de six bits.
Par exemple avec le graphe aux sommets A, B et C évoqué ci-dessus la séquence 101001 signifierait qu'il y'a les arcs `A --> B`, `A --> C` et `C --> B`.
Il y a donc autant de graphes orientés à trois sommets que de séquences de six bits, soit $2^6 = 64$ graphes orientés à trois sommets.
**Remarque :** C'est aussi le nombre de matrices d'adjacence de la forme :
````python
[[ 0, a, b ],
[ d, 0, c ],
[ e, f, 0 ]]
```
où `a, b, c, d, e` et `f` sont à choisir parmi `0` ou `1` ... soit également $2^6$ matrices possibles.
</div>
</details>
Sur un graphe orienté à trois sommets, il y a potentiellement six arcs.
Par exemple, si le graphe comporte trois sommets A, B et C il y a les six arcs potentiels suivants :
A --> B B --> A A --> C C --> A B --> C C --> B
Un graphe orienté à trois sommets est donc défini par la présence, ou l'absence, de chacun de ces six arcs potentiels. Un tel graphe peut donc être modélisé par une séquence de six bits.
Par exemple avec le graphe aux sommets A, B et C évoqué ci-dessus la séquence 101001 signifierait qu'il y'a les arcs A --> B
, A --> C
et C --> B
.
Il y a donc autant de graphes orientés à trois sommets que de séquences de six bits, soit $2^6 = 64$ graphes orientés à trois sommets.
Remarque : C'est aussi le nombre de matrices d'adjacence de la forme :
[[ 0, a, b ],
[ d, 0, c ],
[ e, f, 0 ]]
```
où `a, b, c, d, e` et `f` sont à choisir parmi `0` ou `1` ... soit également @@1@@ matrices possibles.
</div>
</details>
xxxxxxxxxx
### Exercice 9
<img src="https://progalgo.fr/images/graphes_exos_7.png" style="width:150px;">
Donner la matrice d'adjacence booléenne du graphe **orienté** représenté ci-dessus.
Donner ensuite son dictionnaire d'adjacence en prenant des tableaux (`list` Python) pour stocker les voisins de chaque sommet.
Donner la matrice d'adjacence booléenne du graphe orienté représenté ci-dessus.
Donner ensuite son dictionnaire d'adjacence en prenant des tableaux (list
Python) pour stocker les voisins de chaque sommet.
xxxxxxxxxx
<details>
<summary style="border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan"> Solution </summary>
<div style="border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan">
```python
M = [[False, False, True, False, False],
[False, False, False, True, False],
[True, True, False, False, False],
[True, False, False, False, False],
[True, True, False, True, False]]
d = {0: [2],
1: [3],
2: [0, 1],
3: [0],
4: [0, 1, 3]}
```
</div>
</details>
M = [[False, False, True, False, False],
[False, False, False, True, False],
[True, True, False, False, False],
[True, False, False, False, False],
[True, True, False, True, False]]
d = {0: [2],
1: [3],
2: [0, 1],
3: [0],
4: [0, 1, 3]}
xxxxxxxxxx
### Exercice 10
<img src="https://progalgo.fr/images/graphes_exos_8.png" style="width:150px;">
Donner la matrice d'adjacence booléenne du graphe **non-orienté** représenté ci-dessus.
Donner ensuite son dictionnaire d'adjacence en prenant des tableaux (`list` Python) pour stocker les voisins de chaque sommet.
Donner la matrice d'adjacence booléenne du graphe non-orienté représenté ci-dessus.
Donner ensuite son dictionnaire d'adjacence en prenant des tableaux (list
Python) pour stocker les voisins de chaque sommet.
xxxxxxxxxx
<details>
<summary style="border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan"> Solution </summary>
<div style="border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan">
```python
M = [[False, False, True, True, True],
[False, False, True, True, True],
[True, True, False, False, False],
[True, True, False, False, True],
[True, True, False, True, False]]
d = {0: [2, 3, 4],
1: [2, 3, 4],
2: [0, 1],
3: [0, 1, 4],
4: [0, 1, 3]}
```
</div>
</details>
M = [[False, False, True, True, True],
[False, False, True, True, True],
[True, True, False, False, False],
[True, True, False, False, True],
[True, True, False, True, False]]
d = {0: [2, 3, 4],
1: [2, 3, 4],
2: [0, 1],
3: [0, 1, 4],
4: [0, 1, 3]}
xxxxxxxxxx
### Exercice 10
<img src="https://progalgo.fr/images/graphes_exos_9.png" style="width:150px;">
Donner la matrice d'adjacence pondérée du graphe orienté représenté ci-contre. On prendra 0 comme coefficient pour désigner l'absence d'arc entre deux sommets.
Donner ensuite son dictionnaire d'adjacence en prenant des dictionnaires pour stocker les voisins de chaque sommet ainsi que les poids des arcs.
Donner la matrice d'adjacence pondérée du graphe orienté représenté ci-contre. On prendra 0 comme coefficient pour désigner l'absence d'arc entre deux sommets.
Donner ensuite son dictionnaire d'adjacence en prenant des dictionnaires pour stocker les voisins de chaque sommet ainsi que les poids des arcs.
xxxxxxxxxx
<details>
<summary style="border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan"> Solution </summary>
<div style="border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan">
```python
M = [[0, 0, 4, 0, 0],
[0, 0, 0, 7, 0],
[2, 1, 0, 0, 0],
[9, 0, 0, 0, 0],
[5, 3, 0, 8, 0]]
d = {0: {2:4},
1: {3:7},
2: {0:2, 1:1},
3: {0:9},
4: {0:5, 1:3, 3:8}
```
</div>
</details>
M = [[0, 0, 4, 0, 0],
[0, 0, 0, 7, 0],
[2, 1, 0, 0, 0],
[9, 0, 0, 0, 0],
[5, 3, 0, 8, 0]]
d = {0: {2:4},
1: {3:7},
2: {0:2, 1:1},
3: {0:9},
4: {0:5, 1:3, 3:8}
xxxxxxxxxx
### Exercice 12
Dessiner le graphe non orienté correspondant au dictionnaire d'adjacence suivant :
```python
dic = { 1 :[2, 3, 5],
2 :[1, 3, 5],
3 :[1, 2, 4],
4 :[3],
5 :[2, 1]}
```
Comment se traduit, dans le dictionnaire, le fait que le graphe est non orienté ?
Dessiner le graphe non orienté correspondant au dictionnaire d'adjacence suivant :
dic = { 1 :[2, 3, 5],
2 :[1, 3, 5],
3 :[1, 2, 4],
4 :[3],
5 :[2, 1]}
Comment se traduit, dans le dictionnaire, le fait que le graphe est non orienté ?
xxxxxxxxxx
<details>
<summary style="border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan"> Solution </summary>
<div style="border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan">
<img src="https://progalgo.fr/images/graphes_exos_94.png" style="width:230px;">
Le fait que le graphe n'est pas orienté se traduit par le fait que si un sommet `i` est présent dans `dic[j]` alors le sommet `j` est présent dans `dic[i]`.
</div>
</details>
Le fait que le graphe n'est pas orienté se traduit par le fait que si un sommet i
est présent dans dic[j]
alors le sommet j
est présent dans dic[i]
.
xxxxxxxxxx
### Exercice 13 :
Dessiner le graphe non orienté correspondant à la matrice d'adjacence suivante :
```python
mat = [[0, 1, 1, 0, 0, 1],
[1, 0, 1, 1, 0, 0],
[1, 1, 0, 0, 0, 0],
[0, 1, 0, 0, 1, 1],
[0, 0, 0, 1, 0, 0],
[1, 0, 0, 1, 0, 0]]
```
Comment se traduit, dans la matrice, le fait que le graphe est non orienté ?
Dessiner le graphe non orienté correspondant à la matrice d'adjacence suivante :
mat = [[0, 1, 1, 0, 0, 1],
[1, 0, 1, 1, 0, 0],
[1, 1, 0, 0, 0, 0],
[0, 1, 0, 0, 1, 1],
[0, 0, 0, 1, 0, 0],
[1, 0, 0, 1, 0, 0]]
Comment se traduit, dans la matrice, le fait que le graphe est non orienté ?
xxxxxxxxxx
<details>
<summary style="border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan"> Solution </summary>
<div style="border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan">
<img src="https://progalgo.fr/images/graphes_exos_95.png" style="width:230px;">
Le fait que le graphe n'est pas orienté se traduit par le fait que si `mat[i][j] = 1` alors `mat[j][i] = 1`. Dit plus simplement la matrice est symétrique par rapport à sa diagonale `\`.
</div>
</details>
Le fait que le graphe n'est pas orienté se traduit par le fait que si mat[i][j] = 1
alors mat[j][i] = 1
. Dit plus simplement la matrice est symétrique par rapport à sa diagonale \
.
xxxxxxxxxx
### Exercice 14 :
On dispose d'une classe `Graphe` implémentant des graphes orientés avec des dictionnaires d'adjacence.
Les méthodes disponibles sont :
- `ajouter_sommet(self, s1) :` ajoute le sommet `s1` au graphe,
- `ajouter_arc(self, s1, s2) :` ajoute l'arc `s1 --> s2` au graphe (et les sommets `s1` et `s2` si besoin),
- `existe_arc(self, s1, s2) :` renvoie `True` si l'arc `s1 --> s2` existe et renvoie `False` sinon,
- `voisins(self, s1) :` renvoie un tableau (`list` python) des sommets voisins du sommet `s1`,
- `schema(self) :` produit un affichage graphique du graphe.
On dispose d'une classe Graphe
implémentant des graphes orientés avec des dictionnaires d'adjacence.
Les méthodes disponibles sont :
ajouter_sommet(self, s1) :
ajoute le sommet s1
au graphe, ajouter_arc(self, s1, s2) :
ajoute l'arc s1 --> s2
au graphe (et les sommets s1
et s2
si besoin), existe_arc(self, s1, s2) :
renvoie True
si l'arc s1 --> s2
existe et renvoie False
sinon, voisins(self, s1) :
renvoie un tableau (list
python) des sommets voisins du sommet s1
, schema(self) :
produit un affichage graphique du graphe.xxxxxxxxxx
from vizu_graphe import VizuGraphe
class Graphe:
'''Graphe orienté représenté par un dictionnaire d'adjacence'''
def __init__(self):
self._dic = dict()
def ajouter_sommet(self, s):
if s not in self._dic:
self._dic[s] = []
def ajouter_arc(self, s1, s2):
self.ajouter_sommet(s1)
self.ajouter_sommet(s2)
self._dic[s1].append(s2)
def existe_arc(self, s1, s2):
return s1 in self._dic.keys() and s2 in self._dic[s1]
def voisins(self, s):
return self._dic[s]
def schema(self):
VizuGraphe('liste', self._dic, env='basthon', oriente = True)
xxxxxxxxxx
Donner une séquence d'instructions permettant d'affecter à `g` le graphe orienté représenté ci-dessous.
<img src="https://progalgo.fr/images/graphes_exos_90.png" style="width:150px;">
Donner une séquence d'instructions permettant d'affecter à g
le graphe orienté représenté ci-dessous.
xxxxxxxxxx
xxxxxxxxxx
<details>
<summary style="border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan"> Solution </summary>
<div style="border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan">
```python
g = Graphe()
g.ajouter_arc(1, 3)
g.ajouter_arc(1, 5)
g.ajouter_arc(3, 5)
g.ajouter_arc(5, 2)
g.ajouter_arc(2, 3)
g.ajouter_arc(3, 2)
g.ajouter_sommet(4)
g.schema()
```
</div>
</details>
g = Graphe()
g.ajouter_arc(1, 3)
g.ajouter_arc(1, 5)
g.ajouter_arc(3, 5)
g.ajouter_arc(5, 2)
g.ajouter_arc(2, 3)
g.ajouter_arc(3, 2)
g.ajouter_sommet(4)
g.schema()
xxxxxxxxxx
### Exercice 15
On dispose d'une classe `Graphe` implémentant des graphes orientés avec des **listes d'adjacence (sous forme de dictionnaire)**.
Les méthodes disponibles sont :
- `ajouter_sommet(self, s1) :` ajoute le sommet `s1` au graphe,
- `ajouter_arc(self, s1, s2) :` ajoute l'arc `s1 --> s2` au graphe (et les sommets `s1` et `s2` si besoin),
- `existe_arc(self, s1, s2) :` renvoie `True` si l'arc `s1 --> s2` existe et renvoie `False` sinon,
- `voisins(self, s1) :` renvoie un tableau (`list` python) des sommets voisins du sommet `s1`,
- `schema(self) :` produit un affichage graphique du graphe.
Cette classe dispose par ailleurs d'un seul attribut `_dic` correspondant à la liste d'adjacence.
Ajouter à cette classe les méthodes suivantes :
- `nb_sommets(self) :` renvoie le nombre de sommets du graphe,
- `degre_sortant(self, s) :` renvoie le nombre d'arcs issus du sommet `s`,
- `nb_arcs(self) :` renvoie le nombre total d'arcs du graphe.
puis tester vos méthodes en effectuant des instructions bien choisies.
On dispose d'une classe Graphe
implémentant des graphes orientés avec des listes d'adjacence (sous forme de dictionnaire).
Les méthodes disponibles sont :
ajouter_sommet(self, s1) :
ajoute le sommet s1
au graphe, ajouter_arc(self, s1, s2) :
ajoute l'arc s1 --> s2
au graphe (et les sommets s1
et s2
si besoin), existe_arc(self, s1, s2) :
renvoie True
si l'arc s1 --> s2
existe et renvoie False
sinon, voisins(self, s1) :
renvoie un tableau (list
python) des sommets voisins du sommet s1
, schema(self) :
produit un affichage graphique du graphe.Cette classe dispose par ailleurs d'un seul attribut _dic
correspondant à la liste d'adjacence.
Ajouter à cette classe les méthodes suivantes :
nb_sommets(self) :
renvoie le nombre de sommets du graphe,degre_sortant(self, s) :
renvoie le nombre d'arcs issus du sommet s
,nb_arcs(self) :
renvoie le nombre total d'arcs du graphe.puis tester vos méthodes en effectuant des instructions bien choisies.
xxxxxxxxxx
from vizu_graphe import VizuGraphe
class Graphe:
'''Graphe orienté représenté par un dictionnaire d'adjacence'''
def __init__(self):
self._dic = dict()
def ajouter_sommet(self, s):
if s not in self._dic:
self._dic[s] = []
def ajouter_arc(self, s1, s2):
self.ajouter_sommet(s1)
self.ajouter_sommet(s2)
self._dic[s1].append(s2)
def existe_arc(self, s1, s2):
return s1 in self._dic.keys() and s2 in self._dic[s1]
def voisins(self, s):
return self._dic[s]
def nb_sommets(self):
...
def degre_sortant(self, s):
...
def nb_arcs(self):
...
def schema(self):
VizuGraphe('liste', self._dic, env='basthon', oriente = True)
xxxxxxxxxx
xxxxxxxxxx
<details>
<summary style="border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan"> Solution </summary>
<div style="border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan">
```python
from vizu_graphe import VizuGraphe
class Graphe:
'''Graphe orienté représenté par un dictionnaire d'adjacence'''
def __init__(self):
self._dic = dict()
def ajouter_sommet(self, s):
if s not in self._dic:
self._dic[s] = []
def ajouter_arc(self, s1, s2):
self.ajouter_sommet(s1)
self.ajouter_sommet(s2)
self._dic[s1].append(s2)
def existe_arc(self, s1, s2):
return s1 in self._dic.keys() and s2 in self._dic[s1]
def voisins(self, s):
return self._dic[s]
def nb_sommets(self):
return len(self._dic)
def degre_sortant(self, s):
return len(self._dic[s])
def nb_arcs(self):
somme = 0
for s, voisins in self._dic.items():
somme = somme + len(voisins)
return somme
def schema(self):
VizuGraphe('liste', self._dic, env='basthon', oriente = True)
```
et pour tester l'implémentation effectuée on peut par exemple exécuter les instructions ci-dessous :
```python
g = Graphe()
g.ajouter_arc(1, 3)
g.ajouter_arc(1, 5)
g.ajouter_arc(3, 5)
g.ajouter_arc(5, 2)
g.ajouter_arc(2, 3)
g.ajouter_arc(3, 2)
g.ajouter_sommet(4)
print(g.nb_sommets())
print(g.degre_sortant(1))
print(g.nb_arcs())
g.schema()
```
</div>
</details>
from vizu_graphe import VizuGraphe
class Graphe:
'''Graphe orienté représenté par un dictionnaire d'adjacence'''
def __init__(self):
self._dic = dict()
def ajouter_sommet(self, s):
if s not in self._dic:
self._dic[s] = []
def ajouter_arc(self, s1, s2):
self.ajouter_sommet(s1)
self.ajouter_sommet(s2)
self._dic[s1].append(s2)
def existe_arc(self, s1, s2):
return s1 in self._dic.keys() and s2 in self._dic[s1]
def voisins(self, s):
return self._dic[s]
def nb_sommets(self):
return len(self._dic)
def degre_sortant(self, s):
return len(self._dic[s])
def nb_arcs(self):
somme = 0
for s, voisins in self._dic.items():
somme = somme + len(voisins)
return somme
def schema(self):
VizuGraphe('liste', self._dic, env='basthon', oriente = True)
et pour tester l'implémentation effectuée on peut par exemple exécuter les instructions ci-dessous :
g = Graphe()
g.ajouter_arc(1, 3)
g.ajouter_arc(1, 5)
g.ajouter_arc(3, 5)
g.ajouter_arc(5, 2)
g.ajouter_arc(2, 3)
g.ajouter_arc(3, 2)
g.ajouter_sommet(4)
print(g.nb_sommets())
print(g.degre_sortant(1))
print(g.nb_arcs())
g.schema()
xxxxxxxxxx
### Exercice 16
On dispose d'une classe `Graphe` implémentant des graphes orientés avec des **matrices d'adjacence**.
Les méthodes disponibles sont :
- `ajouter_arc(self, s1, s2) :` ajoute l'arc `s1 --> s2` au graphe (et les sommets `s1` et `s2` si besoin),
- `existe_arc(self, s1, s2) :` renvoie `True` si l'arc `s1 --> s2` existe et renvoie `False` sinon,
- `voisins(self, s1) :` renvoie un tableau (`list` python) des sommets voisins du sommet `s1`,
- `schema(self) :` produit un affichage graphique du graphe.
Cette classe dispose par ailleurs d'un seul attribut `_mat` correspondant à la liste d'adjacence.
Ajouter à cette classe les méthodes suivantes :
- `nb_sommets(self) :` renvoie le nombre de sommets du graphe,
- `degre_sortant(self, s) :` renvoie le nombre d'arcs issus du sommet `s`,
- `nb_arcs(self) :` renvoie le nombre total d'arcs du graphe.
puis tester vos méthodes en effectuant des instructions bien choisies.
On dispose d'une classe Graphe
implémentant des graphes orientés avec des matrices d'adjacence.
Les méthodes disponibles sont :
ajouter_arc(self, s1, s2) :
ajoute l'arc s1 --> s2
au graphe (et les sommets s1
et s2
si besoin), existe_arc(self, s1, s2) :
renvoie True
si l'arc s1 --> s2
existe et renvoie False
sinon, voisins(self, s1) :
renvoie un tableau (list
python) des sommets voisins du sommet s1
, schema(self) :
produit un affichage graphique du graphe.Cette classe dispose par ailleurs d'un seul attribut _mat
correspondant à la liste d'adjacence.
Ajouter à cette classe les méthodes suivantes :
nb_sommets(self) :
renvoie le nombre de sommets du graphe,degre_sortant(self, s) :
renvoie le nombre d'arcs issus du sommet s
,nb_arcs(self) :
renvoie le nombre total d'arcs du graphe.puis tester vos méthodes en effectuant des instructions bien choisies.
xxxxxxxxxx
from vizu_graphe import VizuGraphe
class Graphe:
'''Graphe orienté représenté par une matrice d'adjacence'''
def __init__(self, n):
"initialise un graphe de taille n"
self._mat = [[False for i in range(n)] for j in range(n)]
def ajouter_arc(self, s1, s2):
self._mat[s1][s2] = True
def existe_arc(self, s1, s2):
return s1 < len(self._mat) and s2 < len(self._mat) and self._mat[s1][s2]
def voisins(self, s):
return [j for j in range(len(self._mat)) if self._mat[s][j] == True]
def nb_sommets(self):
...
def degre_sortant(self, s):
...
def nb_arcs(self):
...
def schema(self):
VizuGraphe('matrice_bool', self._mat, env='basthon', oriente = True)
xxxxxxxxxx
xxxxxxxxxx
<details>
<summary style="border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan"> Solution </summary>
<div style="border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan">
```python
from vizu_graphe import VizuGraphe
class Graphe:
'''Graphe orienté représenté par un dictionnaire d'adjacence'''
def __init__(self, n):
"initialise un graphe de taille n"
self._mat = [[False for i in range(n)] for j in range(n)]
def ajouter_arc(self, s1, s2):
self._mat[s1][s2] = True
def existe_arc(self, s1, s2):
return s1 < len(self._mat) and s2 < len(self._mat) and self._mat[s1][s2]
def voisins(self, s):
return [j for j in range(len(self._mat)) if self._mat[s][j] == True]
def nb_sommets(self):
return len(self._mat)
def degre_sortant(self, s):
return len(self.voisins(s))
def nb_arcs(self):
somme = 0
for lig in range(len(self._mat)):
for col in range(len(self._mat)):
if self._mat[lig][col]:
somme = somme + 1
return somme
def schema(self):
VizuGraphe('matrice_bool', self._mat, env='basthon', oriente = True)
```
et pour tester l'implémentation effectuée on peut par exemple exécuter les instructions ci-dessous :
```python
g = Graphe(6)
g.ajouter_arc(0, 1)
g.ajouter_arc(1, 3)
g.ajouter_arc(1, 5)
g.ajouter_arc(3, 5)
g.ajouter_arc(5, 2)
g.ajouter_arc(2, 3)
g.ajouter_arc(3, 2)
print(g.nb_sommets())
print(g.degre_sortant(1))
print(g.nb_arcs())
g.schema()
```
</div>
</details>
from vizu_graphe import VizuGraphe
class Graphe:
'''Graphe orienté représenté par un dictionnaire d'adjacence'''
def __init__(self, n):
"initialise un graphe de taille n"
self._mat = [[False for i in range(n)] for j in range(n)]
def ajouter_arc(self, s1, s2):
self._mat[s1][s2] = True
def existe_arc(self, s1, s2):
return s1 < len(self._mat) and s2 < len(self._mat) and self._mat[s1][s2]
def voisins(self, s):
return [j for j in range(len(self._mat)) if self._mat[s][j] == True]
def nb_sommets(self):
return len(self._mat)
def degre_sortant(self, s):
return len(self.voisins(s))
def nb_arcs(self):
somme = 0
for lig in range(len(self._mat)):
for col in range(len(self._mat)):
if self._mat[lig][col]:
somme = somme + 1
return somme
def schema(self):
VizuGraphe('matrice_bool', self._mat, env='basthon', oriente = True)
et pour tester l'implémentation effectuée on peut par exemple exécuter les instructions ci-dessous :
g = Graphe(6)
g.ajouter_arc(0, 1)
g.ajouter_arc(1, 3)
g.ajouter_arc(1, 5)
g.ajouter_arc(3, 5)
g.ajouter_arc(5, 2)
g.ajouter_arc(2, 3)
g.ajouter_arc(3, 2)
print(g.nb_sommets())
print(g.degre_sortant(1))
print(g.nb_arcs())
g.schema()