반응형
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
2 초 | 128 MB | 31673 | 13620 | 7408 | 39.925% |
문제
그래프가 주어졌을 때, 그 그래프의 최소 스패닝 트리를 구하는 프로그램을 작성하시오.
최소 스패닝 트리는, 주어진 그래프의 모든 정점들을 연결하는 부분 그래프 중에서 그 가중치의 합이 최소인 트리를 말한다.
입력
첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이 가중치 C인 간선으로 연결되어 있다는 의미이다. C는 음수일 수도 있으며, 절댓값이 1,000,000을 넘지 않는다.
그래프의 정점은 1번부터 V번까지 번호가 매겨져 있고, 임의의 두 정점 사이에 경로가 있다. 최소 스패닝 트리의 가중치가 -2,147,483,648보다 크거나 같고, 2,147,483,647보다 작거나 같은 데이터만 입력으로 주어진다.
출력
첫째 줄에 최소 스패닝 트리의 가중치를 출력한다.
예제 입력 1
3 3
1 2 1
2 3 2
1 3 3
예제 출력 1
3
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int n,m;
static int[] parent;
static PriorityQueue<edge> pq = new PriorityQueue<edge>();
static int result = 0;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
parent = new int[n+1];
for(int i=0; i<n+1; i++) {
parent[i] = i;
}
for(int i=0; i<m; i++) {
st = new StringTokenizer(br.readLine());
pq.add(new edge(Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken())));
}
//시작점과 종료점의 최상위 노드를 찾아서 겹치면 사이클이 생기는 것이므로 continue를 한다.
//아니면 union을 통해 연결하고 v 를 더해준다.
for(int i=0; i<m; i++) {
edge tmp = pq.poll();
int a = find(tmp.s);
int b = find(tmp.e);
if(a==b) continue;
union(a,b);
result += tmp.v;
}
System.out.println(result);
}
//크루스칼의 기본 union find!! 외워두는게 편하다.
public static int find(int a) {
if(a == parent[a]) return a;
parent[a] = find(parent[a]);
return parent[a];
}
public static void union(int a,int b) {
int aRoot = find(a);
int bRoot = find(b);
if(aRoot != bRoot) {
parent[aRoot] = b;
} else {
return;
}
}
}
//간선 class
//우선순위 큐를 사용하기 위해서 Comparable을 통해 정렬 우선순위를 정했다. (V 기준)
class edge implements Comparable<edge>{
int s;
int e;
int v;
public edge(int s,int e,int v) {
this.s = s;
this.e = e;
this.v = v;
}
@Override
public int compareTo(edge arg0) {
// TODO Auto-generated method stub
return arg0.v >= this.v ? -1:1;
}
}
반응형
'알고리즘 > [ Baekjoon ]' 카테고리의 다른 글
[ BOJ ][JAVA][1260] DFS와 BFS (0) | 2021.04.18 |
---|---|
[ BOJ ][JAVA][1208] 부분수열의 합 2 (0) | 2021.04.17 |
[ BOJ ][JAVA][1991] 트리 순회 (0) | 2021.04.17 |
[ BOJ ][JAVA][1238] 파티 (0) | 2021.04.17 |
[ BOJ ][JAVA][1212] 8진수 2진수 (0) | 2021.04.17 |