問題タブ [disjoint-sets]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
algorithm - Disjoint Setsを使用して無向グラフでサイクルを検出する方法は?
アルゴリズム:
グラフ:
(1)------(2)
隣接リスト:
[1] -> [2]
[2] -> [1]
素集合:
{{1}、{2}}
反復 1 :
エッジ e = (1, 2)
ユニオン(1, 2)
素集合 = {{1, 2}}
反復 2 :
エッジ e = (2, 1)
2 と 1 の両方が同じセットに属しているため、アルゴリズムはサイクルを検出します。グラフにサイクルが含まれていないことは明らかです。
このアルゴリズムは、有向グラフに対して問題なく機能します。この分析を手伝ってください。
graph-algorithm - 有向グラフの Union-Find/Disjoin-Set データ構造
サイクルとフォレストを持つ有向グラフの効率的なUnion-Find (別名Disjoint Set ) データ構造を探しています。このようなグラフが与えられた場合、次のクエリに答えたいと思います。G
v
からノードに到達できますu
か?- 到達できないノード
u
はどれですか?
単一の「ソース」ノードの場合、 DFS検索をu
実行して、そこから到達できるかどうかを確認できます。1 回の DFS 検索の上限コストは、最悪の場合 です。ここで、とは、それぞれグラフ内の頂点とエッジの数です。ただし、私はそのような「ソース」ノードを多数持っており、すべての「ソース」ノードから個別に DFS を実行するよりも優れたアプローチがあるかどうか疑問に思っています (最悪の場合、上限コストはです)。v
m + n
m
n
m
m * (m + n)
これらの質問の両方は、有向グラフの Union-Find データ構造によって効率的に回答できるようです。驚いたことに、かなりのオンライン検索を行っても解決策が見つかりませんでした。問題を間違った方向に考えていますか?
この答えを見つけましたが、理解できませんでした。