๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/1167)
< ํธ๋ฆฌ์ ์ง๋ฆ >
๋ฌธ์ ํ์ด
์ฒ์์๋ ์ ์ 1์์ dfs ํ์์ ํตํด ์ง๋ฆ์ ๊ตฌํ๋ค. ๋ด๊ฐ ๊ตฌํํ ์ฝ๋ ๋ฐฉ์์ผ๋ก๋ ๋ง์ฝ ์ ์ 1์์ 3๊ฐ์ ์์์ด ์๋ค๋ฉด ๊ฐ DFS๋ฅผ ํตํด 3๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ํ ๊ฐ์ด ํธ๋ฆฌ์ ์ง๋ฆ์ด ๋๋ ๊ฒ์ด์๋ค. ํ์ง๋ง ํธ๋ฆฌ์ ์ง๋ฆ์ ์์์ ๋ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ ์ค์์ ๊ฐ์ฅ ๊ธด ๊ฒ์ ๋ปํ๋ฏ๋ก ์ ๋๋ก ๋ ๋ต์ ๊ตฌํ ์ ์์๋ค.
ํธ๋ฆฌ์ ์ง๋ฆ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณด๋ ๋ค์๊ณผ ๊ฐ์๋ค.
1. DFS๋ฅผ ํตํด ์์์ ์ ์ (a)์ผ๋ก๋ถํฐ ๊ฐ์ฅ ๋จผ ์ ์ (b)์ ๊ตฌํจ
2. ๊ฐ์ฅ ๋จผ ์ ์ (b)์ผ๋ก๋ถํฐ DFS๋ฅผ ํตํด ๊ฐ์ฅ ๋จผ ์ ์ (c)์ ๊ตฌํจ
3. 2๋ฒ์์ ๊ตฌํ ๊ฐ์ฅ ๋จผ ์ ์ (b)๊ณผ ์๋ก ๊ตฌํ ๊ฐ์ฅ ๋จผ ์ ์ (c)์ ๊ฑฐ๋ฆฌ๊ฐ ํธ๋ฆฌ์ ์ง๋ฆ์ด ๋๋ค.
my solution (Java)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class _1167_ { // ํธ๋ฆฌ์ ์ง๋ฆ
static int max, max_num;
static boolean visited[];
static ArrayList<ArrayList<Node>> list;
static class Node {
private int num;
private int d;
public Node(int num, int d) {
this.num = num;
this.d = d;
}
}
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int v = Integer.parseInt(bf.readLine());
list = new ArrayList<>();
visited = new boolean[v + 1];
for (int i = 0; i <= v; i++) {
list.add(new ArrayList<>());
}
for (int i = 0; i < v; i++) {
st = new StringTokenizer(bf.readLine());
int a = Integer.parseInt(st.nextToken());
while (st.hasMoreTokens()) {
int b = Integer.parseInt(st.nextToken());
if (b == -1)
break;
int d = Integer.parseInt(st.nextToken());
list.get(a).add(new Node(b, d));
}
}
int result = 0, result_num = 0;
visited[1] = true;
// ์์์ ์ ์ ๋ถํฐ ๊ฐ์ฅ ๋จผ ์ ์ ๊ตฌํ๊ธฐ
for (int i = 0; i < list.get(1).size(); i++) {
if (!visited[list.get(1).get(i).num]) {
max = list.get(1).get(i).d;
max_num = list.get(1).get(i).num;
dfs(list.get(1).get(i).num, list.get(1).get(i).d);
if (result < max) {
result = max;
result_num = max_num;
}
}
}
// ๊ตฌํด์ง ์ ์ ์์ ๊ฐ์ฅ ๋จผ ์ ์ ๊ตฌํ๊ธฐ
max = 0;
for (int i = 0; i <= v; i++) {
visited[i]=false;
}
dfs(result_num, 0);
System.out.println(max);
}
private static void dfs(int num, int d) {
visited[num] = true;
for (int i = 0; i < list.get(num).size(); i++) {
if (!visited[list.get(num).get(i).num]) {
if (max < d + list.get(num).get(i).d) {
max = d + list.get(num).get(i).d;
max_num = list.get(num).get(i).num;
}
dfs(list.get(num).get(i).num, d + list.get(num).get(i).d);
}
}
}
}
๋ณ์)
v : ์ ์ ์ ๊ฐ์
list : ๊ฐ ์ ์ ์ ๊ฐ์ ์ ์ ๋ณด ์ ์ฅ
visited : ๋ฐฉ๋ฌธ ์ฌ๋ถ
a, b, d : ์ ์ ๋ฒํธ, ์ฐ๊ฒฐ๋ ์ ์ ๋ฒํธ, ๊ทธ ์ ์ ๊น์ง์ ๊ฑฐ๋ฆฌ
max, max_num : ์์์ ์ ์ ๋ถํฐ ๊ฐ์ฅ ๋จผ ์ ์ ์ ๊ฑฐ๋ฆฌ์ ์ ์
result, result_num : ์์์ ์ ์ ๋ถํฐ ๊ฐ์ฅ ๋จผ ์ ์ ์ ๊ฑฐ๋ฆฌ์ ์ ์ ์ ์ต๋๊ฐ
Node
์ ์ ์ ๋ฒํธ์ ๊ฑฐ๋ฆฌ
Main
์ ์ ์ ๊ฐ์์ ๊ฐ์ ์ ์ ๋ณด๋ฅผ ์ ๋ ฅ๋ฐ์ ์ ์ฅํ๋ค. 1๋ฒ ์ ์ ์ ์์์ ์ผ๋ก ์์๋ก ๋๊ณ DFS๋ฅผ ํตํด 1๋ฒ ์ ์ ์ผ๋ก๋ถํฐ ๊ฐ์ฅ ๋จผ ๊ฑฐ๋ฆฌ์ ์๋ ์ ์ ์ ๊ตฌํ๋ค. ๊ฐ์ฅ ๋จผ ๊ฑฐ๋ฆฌ์ ์๋ ์ ์ ์ ์์์ ์ผ๋ก ๋๊ณ DFS๋ฅผ ํตํด ํธ๋ฆฌ์ ์ง๋ฆ์ ๊ตฌํ๋ค.
dfs (์ ์ , ๊ฑฐ๋ฆฌ)
๋จผ์ , ์ ์ ์ ๋ฐฉ๋ฌธ ํ์๋ก ๋ฐ๊พผ๋ค. ํ์ฌ ์ ์ ๊ณผ ์ฐ๊ฒฐ๋ ์ ์ ์ ํ์ํ๋ฉฐ ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด ๊ฑฐ๋ฆฌ๋ฅผ ์ต๋๊ฐ์ผ๋ก ์ ๋ฐ์ดํธํ ํ DFS ํจ์ ํธ์ถํ๋ค.
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 2578_๋น๊ณ (1) | 2024.02.06 |
---|---|
[Baekjoon] 19238_์คํํธ ํ์ (1) | 2024.02.05 |
[Baekjoon] 11967_๋ถ์ผ๊ธฐ (0) | 2024.02.01 |
[Baekjoon] 8892_ํฐ๋ฆฐ๋๋กฌ (1) | 2024.01.31 |
[Baekjoon] 19637_IF๋ฌธ ์ข ๋์ ์จ์ค (1) | 2024.01.30 |