Aperçu
Dans ce tutoriel, nous allons discuter du concept de composants connectés dans un graphique non orienté.
Nous allons passer en revue quelques exemples simples pour obtenir une compréhension de base, puis nous listerons les propriétés des composants connectés.
Définition de composant connecté
Un composant connecté ou simplement un composant d’un graphe non orienté est un sous-graphe dans lequel chaque paire de nœuds est connectée les uns aux autres via un chemin.
Essayons cependant de le simplifier davantage. Un ensemble de nœuds forme un composant connecté dans un graphe non orienté si un nœud de l’ensemble de nœuds peut atteindre un autre nœud en traversant des arêtes. Le point principal ici est l’accessibilité.
Dans les composants connectés, tous les nœuds sont toujours accessibles les uns des autres.
Quelques exemples
Dans cette section, nous allons discuter de quelques exemples simples. Nous allons essayer de relier les exemples à la définition donnée ci-dessus.
3.1. Un composant connecté
Dans cet exemple, le graphe non orienté donné a un composant connecté:
Nommons ce graphique . Ici désigne l’ensemble des sommets et désigne l’ensemble des arêtes de . Le graphe a un composant connecté, nommons-le , qui contient tous les sommets de . Vérifions maintenant si l’ensemble tient à la définition ou non.
Selon la définition, les sommets de l’ensemble doivent se rejoindre via un chemin. Nous choisissons deux sommets aléatoires et :
- est accessible à via:
- est accessible à via:
Les sommets et satisfait la définition, et nous pourrions également faire de même avec d’autres paires de sommets dans .
3.2. Plus d’Un composant connecté
Dans cet exemple, le graphe non orienté a trois composants connectés:
Let’s name this graph as , where , and . The graph has 3 connected components: and .
Voyons maintenant si les composants connectés et satisfont ou non à la définition. Nous choisirons au hasard une paire de chaque , et .
Dans l’ensemble , choisissons les sommets et .
- est accessible à via:
- est accessible à via:
Maintenant, choisissons les sommets et de l’ensemble .
- is reachable to
- is reachable to
Finally, let’s pick the vertices and from the set .
- is reachable to
- est accessible à
Ainsi, à partir de ces démonstrations simples, il est clair que , et suivent la définition du composant connecté.
Propriétés
Comme nous avons déjà discuté de la définition et démontré quelques exemples des composants connectés, c’est le bon moment pour énumérer certaines des propriétés importantes que le composant connecté détient toujours.
Tout d’abord, le jeu de composants connecté est toujours non vide.
De plus, s’il y a plus d’une composante connectée pour un graphe donné, l’union des composantes connectées donnera l’ensemble de tous les sommets du graphe donné.
Par exemple :
Enfin, les ensembles de composants connectés sont disjoints par paires. Cela signifie que si nous prenons l’intersection entre deux ensembles de composants connectés différents, l’intersection sera égale à un ensemble vide ou à un ensemble nul.
Considérons à nouveau les composants connectés du graphe . Dans , vérifions cette propriété:
Trouver des composants connectés
Étant donné un graphique non orienté, il est important de connaître le nombre de composants connectés pour analyser la structure du graphique – il a de nombreuses applications réelles. Nous pouvons utiliser DFS ou BFS pour cette tâche.
Dans cette section, nous allons discuter d’un algorithme basé sur DFS qui nous donne le nombre de composants connectés pour un graphe non orienté donné :
La variable Component_Count renvoie le nombre de composants connectés dans le graphique donné.
Nous commençons par initialiser tous les sommets au drapeau non visité. Nous choisissons ensuite n’importe quel sommet aléatoire pour commencer et vérifions si nous avons visité le sommet ou non. Si ce n’est pas le cas, nous appelons la fonction DFS.
Une fois que tous les sommets marqués comme visités, l’algorithme se termine et imprime le nombre de composants connectés.
Dans la fonction DFS, les arguments que nous passons sont un ensemble de sommets contenant tous les sommets du graphe donné et un sommet particulier qui doit appartenir à l’ensemble de sommets.
Tout d’abord, nous marquons le sommet d’entrée particulier comme visité. Ensuite, nous calculons les sommets adjacents du sommet d’entrée particulier donné. Pour chaque sommet adjacent, nous vérifions si nous les avons visités ou non. Sinon, nous appelons la fonction DFS récursivement jusqu’à ce que nous marquions tous les sommets adjacents comme visités.
Le point clé à observer dans l’algorithme est que le nombre de composants connectés est égal au nombre d’appels de fonction DFS indépendants. La variable Component_Count compte le nombre d’appels. Bien sûr, cela n’inclut pas les appels qui sont effectués sous la fonction DFS() de manière récursive.
Exécution du test
Exécutons l’algorithme sur un exemple de graphique:
Étant donné un graphe non orienté , où , et .
La première étape de l’algorithme consiste à initialiser tous les sommets et à les marquer comme non visités.
Le sommet rouge indique qu’il n’est pas visité. Le sommet vert indique qu’il est visité par l’algorithme:
Nous pouvons choisir n’importe quel sommet de la liste des sommets pour démarrer l’algorithme. Choisissons .
L’algorithme vérifie s’il est visité ou non. Dans ce cas, n’est pas visité. Il appelle donc .
Dans le DFS(), tout d’abord, il étiquette le sommet comme visité et recherche les sommets adjacents de . Tous les sommets adjacents sont également marqués comme visités. Lorsque DFS termine la visite de tous les sommets adjacents de , le Component_Count devient 1 et l’état des sommets est mis à jour:
Encore une fois, l’algorithme choisit n’importe quel sommet aléatoire. Choisissons cette fois.
Il vérifie si est déjà visité ou non. Comme il n’est pas visité, l’algorithme appelle . Encore une fois, l’algorithme marque le sommet comme visité, et DFS recherche ses sommets adjacents et les marque comme visités. Maintenant, le Component_Count devient 2 et l’état de la liste de sommets est à nouveau mis à jour:
L’algorithme continue et choisit , vérifie l’état et appelle . Le sommet et ses sommets adjacents sont étiquetés comme visités et le Component_Count passe à 3. L’algorithme met à jour l’état de la liste des sommets :
Enfin, l’algorithme choisit , appelle , et fait comme visité. Le sommet n’a pas de sommets adjacents, donc DFS retourne et Component_Count augmente à 4. Enfin, l’algorithme met à jour l’état de la liste des sommets :
Lorsque l’algorithme a fini de parcourir tous les sommets du graphe , il se termine et renvoie la valeur de Component_Count qui est égale au nombre de composants connectés dans div>. Dans ce cas, les algorithmes trouvent quatre composants connectés dans :
Nous avons utilisé quatre couleurs différentes pour illustrer les composants connectés dans , à savoir: .
Analyse de complexité temporelle
L’algorithme que nous venons de voir pour trouver des composants connectés dans un graphique non orienté donné utilise la recherche DFS et compte le nombre d’appels à la fonction DFS. Si le graphe est représenté par la liste d’adjacence, la recherche DFS visite tous les sommets une fois et chaque arête deux fois dans le cas d’un graphe non orienté. La vérification de l’état du sommet prend temps. Ainsi, au total, notre algorithme prendra temps.
Dans le cas où le graphe est représenté par la matrice d’adjacence, la recherche DFS prend temps car elle doit parcourir toute la ligne pour évaluer les sommets voisins. La vérification de l’état du sommet prend à nouveau le temps . Nous donnant ainsi un total de temps.
Conclusion
Dans cet article, nous avons discuté d’une définition simple du composant connecté suivie de quelques exemples simples et faciles à comprendre. En outre, nous avons énuméré certaines propriétés communes mais importantes des composants connectés.
Ensuite, nous avons discuté d’un algorithme basé sur la recherche DFS pour trouver le nombre de composants connectés dans un graphique donné. Nous avons démontré l’algorithme à l’aide d’un exemple de graphique. Enfin, nous avons analysé la complexité temporelle de l’algorithme.