[デコード]クルーズアルゴリズム
クルーズアルゴリズム
すべてのノードを最小限のコストで接続このコードは、集合を分割する際にも使用可能である. 1. make
作成 はすべての要素を自分の代表にします. Aが属する集合の代表 を検索
を返します.は、2つの要素を1つのセット に結合する.
は、ブール値を返します. であれば、2つが同じ集合ではないことを意味します.
つなぎ島
https://programmers.co.kr/learn/courses/30/lessons/42861?language=java解答コード
すべてのノードを最小限のコストで接続
作成
// N은 노드의 개수이다.
void make() {
parents = new int[N];
for ( int i = 0 ; i<N ; i++ ) {
parents[i];
}
2. findを返します.
int find(int a){
if ( a == parents[a] ) return a;
return parents[a] = find(parents[a]);
}
3. unionは、
boolean union(int a, int b){
int a_root = find(a);
int b_root = find(b);
if ( a_root == b_root ) return false;
parents[b_root] = a_root;
return true;
}
4.クルーズアルゴリズムの例つなぎ島
https://programmers.co.kr/learn/courses/30/lessons/42861?language=java
public class Solution {
static class Node implements Comparable<Node> {
int a;
int b;
int cost;
public Node(int a, int b, int cost) {
this.a = a;
this.b = b;
this.cost = cost;
}
@Override
public int compareTo(Node o) {
return this.cost - o.cost;
}
}
static int N;
// 우선순위 큐로 구현해도 된다.
static PriorityQueue<Node> road;
static int[] parents;
// 소속 찾기
static int find(int param ) {
if ( param == parents[param]) return param;
return parents[param] = find(parents[param]);
}
static boolean union(int A, int B) {
int A_union = find(A);
int B_union = find(B);
if ( A_union == B_union ) {
return false;
// 같은 집합이다.
}
parents[B_union] = A_union;
return true;
}
static public int solution(int n, int[][] costs) {
// 초기화
int answer = 0;
N = n;
parents = new int[n];
// 모든 원소를 자신의 대표자로
for (int i = 0; i < N; i++) {
parents[i] = i;
}
Arrays.sort(costs, (e1,e2) -> e1[2] - e2[2]);
int temp = 0;
for(int[] arr : costs) {
int a = arr[0];
int b = arr[1];
int cost = arr[2];
if ( union(arr[0], arr[1] )) {
answer += arr[2];
temp += 1;
if ( temp >= N ) break;
}
if ( temp >= n ) break;
}
return answer;
}
}
Reference
この問題について([デコード]クルーズアルゴリズム), 我々は、より多くの情報をここで見つけました https://velog.io/@alwaysryu13/디폴트코드-크루스칼-알고리즘テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol