Skip to content

Commit 911dff5

Browse files
authored
[20251214] BOJ / P4 / 유럽여행 / 한종욱
1 parent 064b778 commit 911dff5

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
```
2+
import java.io.*;
3+
import java.util.*;
4+
5+
public class Main {
6+
private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
7+
private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
8+
private static PriorityQueue<Edge> edges;
9+
private static int[] arr, uf, size;
10+
private static int N, P, cost;
11+
12+
public static void main(String[] args) throws IOException {
13+
init();
14+
int answer = MST(cost);
15+
16+
bw.write(answer + "\n");
17+
bw.flush();
18+
bw.close();
19+
br.close();
20+
}
21+
22+
private static void init() throws IOException {
23+
StringTokenizer st = new StringTokenizer(br.readLine());
24+
N = Integer.parseInt(st.nextToken());
25+
P = Integer.parseInt(st.nextToken());
26+
cost = 1001;
27+
28+
arr = new int[N+1];
29+
uf = new int[N+1];
30+
size = new int[N+1];
31+
32+
for (int i = 1; i <= N; i++) {
33+
arr[i] = Integer.parseInt(br.readLine());
34+
cost = Math.min(cost, arr[i]);
35+
uf[i] = i;
36+
size[i] = 1;
37+
}
38+
39+
edges = new PriorityQueue<>((o1, o2) -> Integer.compare(o1.w, o2.w));
40+
41+
for (int i = 0; i < P; i++) {
42+
st = new StringTokenizer(br.readLine());
43+
int s = Integer.parseInt(st.nextToken());
44+
int e = Integer.parseInt(st.nextToken());
45+
int l = Integer.parseInt(st.nextToken());
46+
47+
edges.add(new Edge(s, e, l*2 + arr[s] + arr[e]));
48+
}
49+
}
50+
51+
private static int MST(int cost) {
52+
int count = 0;
53+
54+
while (count < N && !edges.isEmpty()) {
55+
Edge edge = edges.poll();
56+
57+
int root1 = find(edge.u);
58+
int root2 = find(edge.v);
59+
60+
if (root1 == root2) continue;
61+
union(edge.u, edge.v);
62+
cost += edge.w;
63+
count++;
64+
}
65+
66+
return cost;
67+
}
68+
69+
private static void union(int x, int y) {
70+
int X = find(x);
71+
int Y = find(y);
72+
73+
if (size[X] < size[Y]) {
74+
uf[X] = Y;
75+
size[Y] += size[X];
76+
} else {
77+
uf[Y] = X;
78+
size[X] += size[Y];
79+
}
80+
}
81+
82+
private static int find(int x) {
83+
if (uf[x] == x) return x;
84+
85+
return uf[x] = find(uf[x]);
86+
}
87+
88+
static class Edge {
89+
int u;
90+
int v;
91+
int w;
92+
93+
public Edge(int u, int v, int w) {
94+
this.u = u;
95+
this.v = v;
96+
this.w = w;
97+
}
98+
}
99+
}
100+
```

0 commit comments

Comments
 (0)