[백준] 1647. 도시 분할 계획 (JAVA, MST, 크루스칼)
728x90
반응형
1647번: 도시 분할 계획
첫째 줄에 집의 개수N, 길의 개수M이 주어진다. N은 2이상 100,000이하인 정수이고, M은 1이상 1,000,000이하인 정수이다. 그 다음 줄부터 M줄에 걸쳐 길의 정보가 A B C 세 개의 정수로 주어지는데 A번 집
www.acmicpc.net
두 개의 마을로 나눈다고 SUBSET하고 뻘짓하다가 시간초과났다 ㅎ
일 단 MST로 연결하되, 모든 정점을 연결한 상황에서 가장 가중치가 큰 길 하나만 없애면
자동으로 두 마을로 나뉘게 된다.
즉 간선을 하나 없앤다 => 간선 개수가 N-2개가 될 때까지만 UNION-FIND해준다.
import java.util.Arrays;
import java.util.Scanner;
class House implements Comparable<House>{
int cur;
int next;
int cost;
public House(int cur,int next, int cost) {
super();
this.cur=cur;
this.next=next;
this.cost = cost;
}
@Override
public int compareTo(House o) {
return this.cost-o.cost;
}
@Override
public String toString() {
return "House [cur=" + cur + ", next=" + next + ", cost=" + cost + "]";
}
}
public class Main {
static int n,m;
static House[] list;
static int[] parent;
static int answer;
static int cnt;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
list=new House[m];
for (int i = 0; i < m; i++) {
list[i]=new House(sc.nextInt(),sc.nextInt(),sc.nextInt());
}
parent=new int[n+1];
for (int i = 1; i <=n; i++) {
parent[i]=i;
}
Arrays.sort(list);
for(House h:list) {
union(h.cur,h.next,h.cost);
if(cnt==n-2)break;
}
System.out.println(answer);
}
private static int find(int x) {
if(x==parent[x])return x;
return parent[x]=find(parent[x]);
}
private static void union(int cur, int next, int cost) {
cur=find(cur);
next=find(next);
if(cur!=next) {
answer+=cost;
cnt+=1;
if(cur<next) {
parent[cur]=next;
}else {
parent[next]=cur;
}
}
}
}
728x90
반응형
'백준' 카테고리의 다른 글
[백준] 1755. 숫자 놀이 (java, 정렬) (0) | 2021.03.29 |
---|---|
[백준] 2629번. 양팔 저울 (java) (0) | 2021.03.29 |
[백준] 11403번 경로 찾기 (java, 플로이드 와샬) (0) | 2021.03.29 |
[백준] 1504번. 특정한 최단 경로 (java, 다익스트라, 최단 경로) (0) | 2021.03.29 |
[백준] 1238. 파티 (java, 다익스트라, 최단 경로) (0) | 2021.03.29 |
TAGS.