web-dev-qa-db-ja.com

グラフで接続されたコンポーネントを見つける

無向グラフ(頂点のリストとして実装)がある場合、その接続されたコンポーネントを見つけるにはどうすればよいですか?クイックユニオンを使用するにはどうすればよいですか?

40
abalcerek

深さ優先検索(DFS)を使用して、個々の接続コンポーネントをすべて訪問済みとしてマークします。

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)

最良の方法は、線形時間O(n)であるこの単純な方法を使用することです。
結合発見アルゴリズムについて尋ねたので:

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

すべてのEdge(u,v)について、クイックユニオン検索データ構造を使用してunion(u,v)を検索し、find(v)を使用して各頂点のセットを検索します。新しいセットはそれぞれ、グラフ内の接続されたコンポーネントです

2
Vikram Bhat