반응형
https://www.acmicpc.net/problem/1368
1368번: 물대기
첫 줄에는 논의 수 N(1 ≤ N ≤ 300)이 주어진다. 다음 N개의 줄에는 i번째 논에 우물을 팔 때 드는 비용 Wi(1 ≤ Wi ≤ 100,000)가 순서대로 들어온다. 다음 N개의 줄에 대해서는 각 줄에 N개의 수가 들어
www.acmicpc.net
import java.util.*;
class Edge implements Comparable<Edge>{
int x, y, cost;
Edge(int x, int y, int cost){
this.x = x;
this.y = y;
this.cost = cost;
}
@Override
public int compareTo(Edge e){
return cost - e.cost;
}
}
public class Main {
static int unf[];
static int Find(int x){
if(unf[x]==-1) return x;
return unf[x] = Find(unf[x]);
}
static void Union(int a, int b){
int a1 = Find(a);
int b1 = Find(b);
if(a1!=b1){
unf[a1] = b1;
}
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
ArrayList<Edge> list = new ArrayList<>();
Collections.sort(list);
int n = sc.nextInt();
unf = new int[n+1];
Arrays.fill(unf,-1);
for(int i=1; i<=n; i++){
int p = sc.nextInt();
list.add(new Edge(0,i,p));
}
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
int p = sc.nextInt();
if(i==j) continue;
list.add(new Edge(i,j,p));
}
}
Collections.sort(list);
int ans = 0;
for(int i=0; i<list.size(); i++){
Edge cur = list.get(i);
int x = cur.x;
int y = cur.y;
int c = cur.cost;
if(Find(x)!=Find(y)){
Union(x,y);
ans += c;
}
}
System.out.println(ans);
}
}
import java.util.*;
class Edge implements Comparable<Edge>{
int x, y, cost;
Edge(int x, int y, int cost){
this.x = x;
this.y = y;
this.cost = cost;
}
@Override
public int compareTo(Edge e){
return cost - e.cost;
}
}
public class Main {
static int unf[];
static int Find(int x){
if(unf[x]==-1) return x;
return unf[x] = Find(unf[x]);
}
static void Union(int a, int b){
int a1 = Find(a);
int b1 = Find(b);
if(a1!=b1){
unf[a1] = b1;
}
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
PriorityQueue<Edge> list = new PriorityQueue<>();
int n = sc.nextInt();
unf = new int[n+1];
Arrays.fill(unf,-1);
for(int i=1; i<=n; i++){
int p = sc.nextInt();
list.add(new Edge(0,i,p));
}
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
int p = sc.nextInt();
if(i==j) continue;
list.add(new Edge(i,j,p));
}
}
int ans = 0;
while(!list.isEmpty()){
Edge cur = list.poll();
int x = cur.x;
int y = cur.y;
int c = cur.cost;
if(Find(x)!=Find(y)){
Union(x,y);
ans += c;
}
}
System.out.println(ans);
}
}
compareTo의 return값이 음수면 객체 본인이 작은 것이고
양수면 객체 본인이 큰 것이다.
반응형
'Algorithm > problem' 카테고리의 다른 글
백준 1719번: 택배 - 플로이드와샬 Java (0) | 2022.06.11 |
---|---|
백준 5972번 : 택배 배송 Java 다익스트라 (0) | 2022.06.11 |
백준 1946번 : 신입사원 - Java fastio, Arraylist , Collections.sort (0) | 2022.05.24 |
백준 14950번: 정복자 prim 알고리즘 - Java (0) | 2022.05.22 |
백준 2638번 : 치즈 Java (0) | 2022.05.20 |