그래프 내 모든 정점이 연결되어있는 트리
Spanning Tree 중에서 사용된 간선들의 가중치 합이 최소인 트리
=> 간선의 가중치의 합이 최소여야 함
class Line implements Comparable<Line> {
int start, end, weight;
public Line(int start, int end, int weight) {
this.start = start;
this.end = end;
this.weight = weight;
}
@Override
public int compareTo(Line obj) {
return Integer.compare(this.weight, obj.weight);
}
}
public static void main() {
// 모든 간선에 대해 시작, 끝, 가중치를 가진 클래스로 우선순위 큐에 입력
PriorityQueue<Line> pq = new PriorityQueue<Line>();
while(!pq.isEmpty()){
Line line = pq.poll();
int startParent = findParent(line.start);
int endParent = findParent(line.end);
// 만약 최상위부모노드가 같으면 선택하지 않음
// 선택된다면 루프가 발생할 수 있기 때문에
if (start == endParent)
continue;
union(line.start, line.end);
}
}
사이클 생성 여부를 확인하는 방법
int[] parent = new int[n];
// 자기 자신의 부모를 자신으로 초기화
for (int i = 0; i < n; i++) {
parent[i] = i;
}
for (Node node : nodes) {
int fromRoot = findParent(node.from);
int toRoot = findParent(node.to);
if (fromRoot == toRoot)
continue;
union(node.from, node.to);
}
public int findParent(int n) {
if (parent[n] == n) {
return parent[n];
}
else parent[n] = findParent(parent[n]);
}
public void union(int n1, int n2) {
int p1 = findParent(n1);
int p2 = findParent(n2);
parent[p1] = p2;
}