Kruskalアルゴリズム&連合検索アルゴリズム
9202 ワード
Union-Find algorithm
各ノードの親ノードを配列に格納します。 最上位の親ノードに再帰的に移動し、それに基づいてセットを分割します。
インプリメンテーション
class UnionFind {
public boolean hasSameParent(int[] parentNodes, int a, int b) {
return findParent(parentNodes, a) == findParent(parentNodes, b);
}
public void union(int[] parentNodes, int a, int b) {
int parentA = findParent(parentNodes, a);
int parentB = findParent(parentNodes, b);
if (parentA > parentB) parentNodes[parentA] = parentB;
else parentNodes[parentB] = parentA;
}
private int findParent(int[] parentNodes, int node) {
if (parentNodes[node] == node) return node;
return findParent(parentNodes, parentNodes[node]);
}
}
Kruskal algorithm
1.最低料金のedgeのみで構成される.
2.cycleは含まれません.
O(eloge)
の時間的複雑さがある.edgeをコストの昇順に並べ替えます。 ソートedge順にループを形成しないedgeを選択し、MSTに追加します。 すべてのノードが親ノードとして同じノードを持つ場合、MSTは完了し、アルゴリズムは終了する。
インプリメンテーション
public int kruskal(int n, int[][] costs) {
Arrays.sort(costs, (Comparator.comparingInt(o -> o[COST])));
int[] parentNodes = createCycleTable(n);
int answer = 0;
for (int[] edge : costs) {
if (!hasSameParent(parentNodes, edge[0], edge[1])) {
union(parentNodes, edge[0], edge[1]);
answer += edge[COST];
}
if (pathCreated(parentNodes)) break;
}
return answer;
}
Reference
この問題について(Kruskalアルゴリズム&連合検索アルゴリズム), 我々は、より多くの情報をここで見つけました https://velog.io/@jwkim/kruskal-algorithm-with-union-find-algorithmテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol