백준 1922 네트워크연결
https://www.acmicpc.net/problem/1922
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int N; //노드 수
static int M; //선의 수
static int[] parent;
static List<Edge> edges;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
edges = new ArrayList<>();
int costSum = 0;
N = Integer.parseInt(br.readLine());
M = Integer.parseInt(br.readLine());
parent = new int[N+1];
//집합관계 초기화
for(int i=1; i<=N; i++){
parent[i] =i;
}
PriorityQueue<Edge> pq = new PriorityQueue<>();
for(int i=0; i<M; i++){
st = new StringTokenizer(br.readLine());
int v1 = Integer.parseInt(st.nextToken());
int v2 = Integer.parseInt(st.nextToken());
int cost = Integer.parseInt(st.nextToken());
pq.offer(new Edge(v1,v2,cost));
}
Edge e;
while(!pq.isEmpty()){
e = pq.poll();
if(find(e.v1)!=find(e.v2)){
union(e.v1, e.v2);
costSum += e.cost;
}
}
System.out.println(costSum);
}
static void union(int a, int b){
int aRoot = find(a);
int bRoot = find(b);
if(aRoot!=bRoot) parent[bRoot] = aRoot;
}
static int find(int a){
if(parent[a]==a) return a;
else{
parent[a] = find(parent[a]);
return parent[a];
}
}
static class Edge implements Comparable<Edge>{
int v1;
int v2;
int cost;
Edge(int v1, int v2, int cost){
this.v1 = v1;
this.v2 = v2;
this.cost = cost;
}
@Override
public int compareTo(Edge e) {
if(this.cost<e.cost) return -1;
else if(this.cost==e.cost) return 0;
else return 1;
}
}
}
static int find(int a){
if(parent[a]==a) return a;
else{
parent[a] = find(parent[a]);
return parent[a];
}
}
밑줄 친 라인을 추가하면 없는 것에 비해 성능이 더 좋다.
PriorityQueue<Edge> pq = new PriorityQueue<>(new Comparator<Edge>(){
@Override
public int compare(Edge o1, Edge o2) {
if(o1.cost < o2.cost) return -1;
else return 1;
}
});
객체 정렬할 때 이런식으로 하면 다양한 조건으로 유연하게 할 수 있을 듯. 앞으로는 이렇게 해야겠다.
'알고리즘 > 문제풀이' 카테고리의 다른 글
[투포인터] 부분합 (0) | 2019.03.08 |
---|---|
[인덱스트리] 구간 합 구하기 (0) | 2019.03.06 |
[그래프] LCA1 (0) | 2019.02.26 |
[Heap] 절댓값 힙 (0) | 2019.01.27 |
[Heap] 최소 힙, 최대 힙 (0) | 2019.01.27 |