[プログラマー/greedy/level 3]島への接続
9487 ワード
コアタイプ
ギリシャ問題
クルーズアルゴリズム
誤答を整理する
問題を解決できなかったので、人の怒りを晴らすを真似してみました.
最初はDFSで解決しようとしたが,DFS内部ナビゲーションロジックをどのように記述するか分からなかった.
クルースカアルゴリズムは初めて聞いたのですが、疎遠でしたが、新しい内容を知り、いい感じでした.
考えた結果、今度の問題は熟考に欠けているようだ.問題を解くにはもっと深くしなければならない.△来週は二度と見ないから、解いてみよう.
学習の場を整理する
1.クルーズカルアルゴリズム(kruskalアルゴリズム)
クルーズアルゴリズムとは?
これは、すべてのノードを最小限のコストで接続するアルゴリズムです.
최소 비용 신장 트리를 만들기 위한 알고리즘
です.最小費用伸長木の解法は?
幹線情報の重み付け値は
오름차순으로 정렬
である.料金は小さい幹線からグラフに含まれています.
2.最小原価生成ツリー
最低コスト延長ツリーとは?
최소
の木MSTの特徴は?
幹線の加重和は最小にします.
n個の頂点の図は
n-1 이하의 간선을 사용
である.사이클이 포함되어서는 안된다
.3.union-findアルゴリズム
합집합 찾기 알고리즘
.△これも集合アルゴリズムです.複数のノードが存在する場合、2つのノードが選択され、現在、2つのノードは
서로 같은 그래프에 속하는지를 판별하는 알고리즘
である.問題の重要な戦略
(クルーズアルゴリズムの概念に基づく解法と同じである.)
権限値を昇順に並べ替えます.
union find
の親配列を生成し、独自のインデックスで初期化します.親ノードが自分と同じノードを見つけるまで再帰を呼び出します.
解題コード
import java.util.Arrays;
import java.util.Comparator;
class Solution {
public int solution(int n, int[][] costs) {
Arrays.sort(costs, Comparator.comparingInt(a -> a[2]));
int[] parents = new int[n];
for (int i = 0; i < n; i++) {
parents[i] = i;
}
int total = 0;
for (int[] edge : costs) {
int from = edge[0];
int to = edge[1];
int weight = edge[2];
int fromParent = findParent(parents, from);
int toParent = findParent(parents, to);
if (fromParent == toParent) {
continue;
}
total += weight;
parents[from] = fromParent;
}
return total;
}
private int findParent(int[] parents, int node) {
if (parents[node] == node) {
return node;
}
return parents[node] = findParent(parents, parents[node]);
}
}
Reference
接続プログラマー-島
[ロドンビン様]クルーズアルゴリズム
[羅東彬様]union-findアルゴリズム:和集アルゴリズムを求める
[アルゴリズム]最小拡張ツリー(MST)
Reference
この問題について([プログラマー/greedy/level 3]島への接続), 我々は、より多くの情報をここで見つけました https://velog.io/@pbg0205/프로그래머스greedylevel3-섬-연결하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol