https://www.acmicpc.net/problem/1717
ํธ๋ ๋์ ์ฌ๊ณ ๊ณผ์ ๋ฐ ๊ฐ์ ์
์ ๋์จ ํ์ธ๋๋ฅผ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ๋ฉด ๋๋ ๋ฌธ์ ๋ค. ์ด์ ์ ํ์๋ ๋ฌธ์ ์ธ๋ฐ ๋ณต์ต์ผ์ ํ๋ฒ ๋ ํ์ด๋ดค๋ค.
์ ๋์จํ์ธ๋๋ make, find, union ์ธ ๋จ๊ณ๋ก ๊ตฌ๋ถํ๋ฉด๋๋๋ฐ, ๊ฐ๊ฐ ์ดํด๋ณด์.
public static void make() {
p = new int[n + 1];
for (int i = 0; i <= n; i++) {
p[i] = i;
}
}
public static int find(int a) {
if (p[a] == a)
return a;
return p[a] = find(p[a]);
}
public static boolean union(int a, int b) {
int pa = find(a);
int pb = find(b);
if (pa == pb)
return false;
p[pb] = pa;
return true;
}
make๋ ๊ทธ๋ฅ i๋ฒ์งธ ๋ถ๋ชจ๊ฐ i๋ผ๋ ๊ฒ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด๋ค. ์ค๋น๋จ๊ณ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
find๊ฐ ํต์ฌ๋ก์ง์ด๊ธฐ ๋๋ฌธ์ union๋จผ์ ๋ณด์.
public static boolean union(int a, int b) {
int pa = find(a);
int pb = find(b);
if (pa == pb)
return false;
p[pb] = pa;
return true;
}
๋น๊ต ๋์ ๋ ๊ฐ๋ฅผ ๊ฐ๊ณ , ๊ฐ๊ฐ์ root๋ฅผ ๊ฐ๊ณ ์จ๋ค. ์ ํํ๋ ์ด๋ ์งํฉ์ ์ํด์๋ ์ง๋ฅผ ์ฐพ๋๋ค. ๊ทธ๊ฒ pa = find(a)๊ณผ์ ์ด๋ค.
๋ง์ฝ ๊ฐ์ ์งํฉ์ ์ํด์์ผ๋ฉด unionํ์ง ์๊ณ , ๋ค๋ฅธ ์งํฉ์ ์ํด์๋ค๋ฉด ์ด์ ์งํฉ์ ํฌํจ์์ผ์ค์ผํ๋ค. ์ด๊ฑด ๊ตฌํ๋ฐฉ์์ ์ฐจ์ด์ธ๋ฐ, ๋๋ ์ฒซ๋ฒ ์งธ ์ธ์๋ฅผ ๋ถ๋ชจ, ๋๋ฒ์งธ ์ธ์๋ฅผ ์์ํ๋ณด ๋ก ์๊ฐํ๊ณ union์ ์ง ๋ค.
b๊ฐ ๊ฐ๋ฆฌํค๋ ์งํฉ์ด a๊ฐ ๊ฐ๋ฆฌํค๋ ์งํฉ์ ๊ฐ๋ฆฌํค๊ฒ ํ๋ฉด ์ด์ a์ b๋ ๊ฐ์ ์งํฉ์ ๊ฐ๋ฆฌํค๊ฒ ๋๊ณ union์ด ๋ฐ์ํ์ผ๋ฏ๋ก true๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
true, false๋ฅผ ๋ฐํํ๋ ์ด์ ๋ ๊ฐ์ ์งํฉ์ธ์ง, ์๋์ง๋ฅผ ํ๋ณํ ์ ์๊ฒ ํ๊ธฐ ์ํจ์ด๋ค.
์ด์ find๋ฅผ ๋ณด์.
public static int find(int a) {
if (p[a] == a)
return a;
return p[a] = find(p[a]);
}
a์ ์งํฉ(p[a])์ด a ์์ ์ด๋ผ๋ฉด ๊ทธ๋ฅ a๋ฅผ ๋ฐํํ๋ฉด ๋๊ณ , ๋ง์ฝ ๊ทธ๊ฒ ์๋๋ฉด a๊ฐ ๊ฐ๋ฆฌํค๋ ์งํฉ์ด p[a]๊ฐ ๊ฐ๋ฆฌํค๋ ์งํฉ์ ์ฌ๊ท์ ์ผ๋ก ๋ฃ์ด์ ๊ฒฐ๊ณผ์ ์ผ๋ก depth๊ฐ 1์ธ ์งํฉ์ด ๋ง๋ค์ด์ง๋๋ก ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
https://www.acmicpc.net/problem/1976
์ ๋์จ ํ์ธ๋๋ฅผ ์ฌ์ฉํด์ ์ด ๋ฌธ์ ๋ฅผ ํ์ด๋ดค๋๋ฐ, ์ด ๋ฌธ์ ์์ ์ค์ํ ์ ์ ๋์ ๋ฒํธ๊ฐ 1๋ถํฐ ์์ํ๋ค๋ ์ ์ด๋ค. ์๋ฌด์๊ฐ์์ด zero-base๋ก ์ ๋์จํ์ธ๋๋ฅผ ์ค์ ํ๋ฉด ํ๋ฆฌ๊ฒ ๋๋ ๋ฌธ์ ๋ค..!
import java.util.*;
import java.io.*;
public class Main {
static int[] p;
static int n;
static void make() {
p = new int[n + 1];
for (int i = 0; i < n; i++) {
p[i] = i;
}
}
static int find(int a) {
if (p[a] == a)
return a;
return p[a] = find(p[a]);
}
static void union(int a, int b) {
int pa = find(a);
int pb = find(b);
if (pa != pb) {
p[pb] = pa;
}
}
public static void main(String[] args) throws Exception {
// System.setIn(new FileInputStream("res/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
make();
int target = Integer.parseInt(br.readLine());
for (int i = 1; i <= n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for (int j = 1; j <= n; j++) {
int tmp = Integer.parseInt(st.nextToken());
if (tmp == 1) {
union(i, j);
}
}
}
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int start = find(Integer.parseInt(st.nextToken()));
boolean flag = true;
if (st.hasMoreTokens()) {
for (int i = 0; i < target - 1; i++) {
int tmp = Integer.parseInt(st.nextToken());
if (start != find(tmp)) {
flag = false;
break;
}
}
}
if (flag) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}
์ ๋ต์ฝ๋
import java.util.*;
import java.io.*;
public class Main {
static int[] p;
static int n;
public static void make() {
p = new int[n + 1];
for (int i = 0; i <= n; i++) {
p[i] = i;
}
}
public static int find(int a) {
if (p[a] == a)
return a;
return p[a] = find(p[a]);
}
public static boolean union(int a, int b) {
int pa = find(a);
int pb = find(b);
if (pa == pb)
return false;
p[pb] = pa;
return true;
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
make();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine(), " ");
int target = Integer.parseInt(st.nextToken());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
if (target == 0) {
// union
union(a, b);
} else {
if (find(a) == find(b)) {
sb.append("YES").append("\n");
} else {
sb.append("NO").append("\n");
}
}
}
System.out.println(sb);
}
}
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์! ๋ก๊ทธ์ธ ์ํด๋ ๋ฉ๋๋ค ^_^
'OJ๐ผ > ์ค๋ต๋ ธํธ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][JAVA] 17822๋ฒ: ์ํ๋๋ฆฌ๊ธฐ (0) | 2024.03.17 |
---|---|
[BOJ][JAVA] 2110๋ฒ: ๊ณต์ ๊ธฐ ์ค์น (0) | 2024.03.06 |
[BOJ][JAVA] 17070๋ฒ: ํ์ดํ ์ฎ๊ธฐ๊ธฐ 1 (0) | 2024.03.03 |
[SWEA][JAVA] 1949. [๋ชจ์ SW ์ญ๋ํ ์คํธ] ๋ฑ์ฐ๋ก ์กฐ์ฑ (0) | 2024.03.01 |
[BOJ][JAVA] 14502: ์ฐ๊ตฌ์ (0) | 2024.03.01 |