Skip to content

Commit 864b113

Browse files
authored
Merge pull request #1081 from AlgorithmWithGod/Ukj0ng
[20251010] BOJ / G3 / 전국시대 / 한종욱
2 parents e521e15 + a62cecd commit 864b113

File tree

1 file changed

+99
-0
lines changed

1 file changed

+99
-0
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
```
2+
import java.io.*;
3+
import java.util.*;
4+
5+
public class Main {
6+
private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
7+
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
8+
private static Map<Integer, Integer> result;
9+
private static int[] power, uf, size;
10+
private static int N, M;
11+
public static void main(String[] args) throws IOException {
12+
init();
13+
14+
for (int i = 1; i <= N; i++) {
15+
int root = find(i);
16+
17+
if (!result.containsKey(root) && power[root] > 0) {
18+
result.put(root, power[root]);
19+
}
20+
}
21+
22+
bw.write(result.size() + "\n");
23+
24+
List<Integer> value = new ArrayList<>(result.values());
25+
Collections.sort(value);
26+
27+
for (int element : value) {
28+
bw.write(element + " ");
29+
}
30+
bw.flush();
31+
bw.close();
32+
br.close();
33+
}
34+
35+
private static void init() throws IOException {
36+
StringTokenizer st = new StringTokenizer(br.readLine());
37+
N = Integer.parseInt(st.nextToken());
38+
M = Integer.parseInt(st.nextToken());
39+
40+
power = new int[N+1];
41+
uf = new int[N+1];
42+
size = new int[N+1];
43+
44+
result = new HashMap<>();
45+
46+
for (int i = 1; i <= N; i++) {
47+
power[i] = Integer.parseInt(br.readLine());
48+
uf[i] = i;
49+
size[i] = 1;
50+
}
51+
52+
for (int i = 0; i < M; i++) {
53+
st = new StringTokenizer(br.readLine());
54+
int O = Integer.parseInt(st.nextToken());
55+
int P = Integer.parseInt(st.nextToken());
56+
int Q = Integer.parseInt(st.nextToken());
57+
58+
union(P, Q, O);
59+
}
60+
}
61+
62+
private static void union(int x, int y, int o) {
63+
int X = find(x);
64+
int Y = find(y);
65+
66+
if (o == 1) {
67+
if (size[X] < size[Y]) {
68+
uf[X] = Y;
69+
size[Y] += size[X];
70+
power[Y] += power[X];
71+
72+
} else {
73+
uf[Y] = X;
74+
size[X] += size[Y];
75+
power[X] += power[Y];
76+
}
77+
} else {
78+
if (power[X] == power[Y]) {
79+
power[X] = 0;
80+
power[Y] = 0;
81+
} else if (power[X] > power[Y]) {
82+
uf[Y] = X;
83+
size[X] += size[Y];
84+
power[X] -= power[Y];
85+
} else {
86+
uf[X] = Y;
87+
size[Y] += size[X];
88+
power[Y] -= power[X];
89+
}
90+
}
91+
}
92+
93+
private static int find(int x) {
94+
if (uf[x] == x) return x;
95+
96+
return uf[x] = find(uf[x]);
97+
}
98+
}
99+
```

0 commit comments

Comments
 (0)