January 24, 2022
크루스칼 알고리즘은 그래프에서 최소 비용 신장 부분 트리를 구하는 알고리즘이다. 크루스칼알고리즘은 Union&Find와 그리디 알고리즘을 같이 사용하여 구현한다.
이후 정렬된 순서대로 간선을 하나하나씩 다음 3, 4번을 반복한다.
이러한 과정을 반복하면 크루스칼 알고리즘이 구현 된다.
이런 그림이 있다면 다음과 같은 순서대로 알고리즘이 진행될 것이다.
… 반복 …
static int[] chArr;
static ArarayList<Node> nodeList;
// NodeClass
static class Node{
int nodeA, nodeB, weight;
public Node(int nodeA,int nodeB,int weight){
this.nodeA = nodeA;
this.nodeB = nodeB;
this.weight = weight;
}
}
// Find
static int find(int n){
if(chArr[n] == n) return n;
return chArr[n] = find(chArr[n]);
}
// Union
static void union(int a, int b){
chArr[find(a)] = chArr[find(b)];
}
public static void main(String[] args){
/// 인풋받는거 ... 중략 ...///
nodeList.sort(n1, n2 -> n1.weight - n2.weight); // weight에 따라 오름차순 정렬
int distance = 0; // 최소길이
for(int i=0; i<nodeList.size(0); i++){
Node node = nodeList.get(i);
if(find(node.nodeA) != find(node.nodeB)){
union(node.nodeA, node.nodeB);
distance+=node.weight;
}
}
}