[プログラマー]#42861島を接続
質問する
n個の島の間に橋を建設する費用(費用)については、すべての島が最小の費用で互いに通行できるようにする解決策を完了し、必要な最小の費用を返してください.
橋を何度も渡っても、たどり着けば通行できます.例えば、A島とB島の間に橋があり、B島とC島の間に橋があれば、A島とC島は互いに通行することができる.
せいげんじょうけん
I/O例
ncostsreturn4[[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]]4
に答える
この問題はMST(最小費用ツリー)問題であり,クルーズアルゴリズムで解くことができる.
import java.util.PriorityQueue;
class Solution {
int[] parent;
public int solution(int n, int[][] costs) {
int answer = 0;
PriorityQueue<Pair> queue = new PriorityQueue<>();
parent = new int[n];
for(int i=0; i<n; i++)
parent[i] = i;
for(int i=0; i<costs.length; i++) {
int start = costs[i][0];
int end = costs[i][1];
int cost = costs[i][2];
queue.add(new Pair(start, end, cost));
}
while(!queue.isEmpty()) {
Pair temp = queue.poll();
int start = temp.start;
int end = temp.end;
int a = find(start);
int b = find(end);
if(a==b) continue;
union(start, end);
answer += temp.cost;
}
return answer;
}
public class Pair implements Comparable<Pair>{
int start;
int end;
int cost;
public Pair(int start, int end, int cost) {
this.start = start;
this.end = end;
this.cost = cost;
}
@Override
public int compareTo(Pair p) {
return this.cost > p.cost ? 1 : -1;
}
}
public void union(int a, int b) {
a = find(a);
b = find(b);
if(a<b) parent[b] = a;
else parent[a] = b;
}
public int find(int a) {
if(parent[a]==a)
return a;
return find(parent[a]);
}
}
Reference
この問題について([プログラマー]#42861島を接続), 我々は、より多くの情報をここで見つけました https://velog.io/@pss407/프로그래머스42861-섬-연결하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol