web-dev-qa-db-fra.com

Rechercher des composants connectés dans un graphique

Si j'ai un graphe non orienté (implémenté comme une liste de sommets), comment puis-je trouver ses composants connectés? Comment utiliser l'union rapide?

40
abalcerek

Utilisez la recherche en profondeur (DFS) pour marquer tous les composants connectés individuels comme visités:

dfs(node u)
  for each node v connected to u :
    if v is not visited :
      visited[v] = true
      dfs(v)


for each node u:
  if u is not visited :
    visited[u] = true
    connected_component += 1
    dfs(u)

La meilleure façon est d'utiliser cette méthode simple qui est le temps linéaire O (n).
Puisque vous avez posé des questions sur l'algorithme de recherche d'union:

for each node parent[node] = node  

for each node u :
   for each node v connected to u :  
       if findset(u)!=findset(v) :
           union(u,v)  

**I assume you know about how findset and union works **  
for each node if (parent[node] == node)  
    connected_component += 1
38
Aseem Goyal

Pour chaque Edge(u,v) recherchez union(u,v) à l'aide de la structure de données rapide de recherche d'union et recherchez l'ensemble de chaque sommet à l'aide de find(v). Chaque nouvel ensemble est un composant connecté dans le graphique

2
Vikram Bhat