๐ก ๋ฌธ์ ์์ฝ
- ํธ๋ฆฌ ๊ตฌ์กฐ์ ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ง๋ค.
- ๊ฐ ๋ ธ๋ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ ๊ฐ์ค์น๊ฐ ์์ผ๋ฉฐ, ์๋ฐฉํฅ์ด๋ค.
- ์ด ํธ๋ฆฌ์์ ๊ฐ์ฅ ๋จผ ๋ ์ ์ ๊ฐ์ ๊ฑฐ๋ฆฌ, ์ฆ ํธ๋ฆฌ์ ์ง๋ฆ์ ๊ตฌํ๋ ๋ฌธ์ .
๐ง ํต์ฌ ๊ฐ๋
- ํธ๋ฆฌ์ ์ง๋ฆ(Tree Diameter): ํธ๋ฆฌ์์ ๊ฐ์ฅ ๊ธด ๊ฒฝ๋ก์ ๊ธธ์ด
- ํธ๋ฆฌ์ ์ฑ์ง์, ์์์ ๋
ธ๋์์ ๊ฐ์ฅ ๋จผ ๋
ธ๋๋ฅผ ๋จผ์ ์ฐพ๊ณ ,
๊ทธ ๋ ธ๋๋ก๋ถํฐ ๋ค์ DFS๋ฅผ ๋๋ ค ์ต๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ฉด ๊ทธ๊ฒ ์ง๋ฆ์ด๋ค.
๐ ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ
1. ์ ๋ ฅ ํ์ฑ
- ๊ฐ ์ ์ ๋ฒํธ์ ์ฐ๊ฒฐ๋ ์ ์ ๋ฒํธ ๋ฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ ๋ ฅ ๋ฐ์
ArrayList<Node>[] graph๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ ๋ฆฌ์คํธ ๊ตฌ์ฑ
(Node๋ ์ฐ๊ฒฐ๋ ๋ ธ๋ ๋ฒํธ์ ๊ฑฐ๋ฆฌ ์ ๋ณด๋ฅผ ํฌํจ)
2. ํธ๋ฆฌ์ ์ง๋ฆ ๊ตฌํ๊ธฐ
1๏ธโฃ DFS 1์ฐจ
- ์์์ ๋ ธ๋(์: 1๋ฒ)์์ ๊ฐ์ฅ ๋ฉ๋ฆฌ ์๋ ๋ ธ๋๋ฅผ ์ฐพ์
- ์ด ๋
ธ๋๋ฅผ
farthestNode๋ณ์์ ์ ์ฅ
2๏ธโฃ DFS 2์ฐจ
- ์์์ ์ฐพ์
farthestNode์์ ๋ค์ DFS ์ํ - ์ต๋๋ก ๋ฉ๋ฆฌ ๋จ์ด์ง ๊ฑฐ๋ฆฌ(
diameter)๋ฅผ ๊ตฌํจ โ ์ด ๊ฐ์ด ์ง๋ฆ
โ ์ ์ฒด ์ฝ๋ (๊ฐ๋ ์ฑ ํฅ์ + ๋ณ์๋ช ์ ๋ฆฌ)
import java.util.*;
public class Main {
static List<Node>[] graph;
static boolean[] visited;
static int diameter = 0;
static int farthestNode = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
graph = new ArrayList[n + 1];
for (int i = 1; i <= n; i++) graph[i] = new ArrayList<>();
for (int i = 0; i < n; i++) {
int from = sc.nextInt();
while (true) {
int to = sc.nextInt();
if (to == -1) break;
int cost = sc.nextInt();
graph[from].add(new Node(to, cost));
}
}
visited = new boolean[n + 1];
dfs(1, 0);
visited = new boolean[n + 1];
dfs(farthestNode, 0);
System.out.println(diameter);
}
static void dfs(int current, int dist) {
if (dist > diameter) {
diameter = dist;
farthestNode = current;
}
visited[current] = true;
for (Node neighbor : graph[current]) {
if (!visited[neighbor.to]) {
dfs(neighbor.to, dist + neighbor.cost);
}
}
}
static class Node {
int to, cost;
Node(int to, int cost) {
this.to = to;
this.cost = cost;
}
}
}
โ ์ ์ฒด ํ๋ฆ ์์ฝ
1. ์ธ์ ๋ฆฌ์คํธ ๊ตฌ์ฑ
2. DFS(1) โ ๊ฐ์ฅ ๋จผ ๋
ธ๋(farthestNode) ํ์
3. DFS(farthestNode) โ ๊ทธ ๋
ธ๋์์ ๊ฐ์ฅ ๋จผ ๊ฑฐ๋ฆฌ(diameter) ํ์
4. ์ถ๋ ฅ diameter๐ฆ ์๊ฐ ๋ณต์ก๋ ๋ถ์
- ์ ์ ๊ฐ์ N (1 โค N โค 100,000)
- ํธ๋ฆฌ๋ ๊ฐ์ ์๊ฐ N - 1
- DFS๋ O(N)์ผ๋ก ๋ ๋ฒ๋ง ์ํ๋จ โ ์ ์ฒด ์๊ฐ๋ณต์ก๋ O(N)
๐ ์ ๋ฆฌ
| ๋ฐฉ์ | ์ค๋ช |
|---|---|
| ์ ๊ทผ๋ฒ | DFS ๋ ๋ฒ ์ํ (์์๋ ธ๋ โ ๊ฐ์ฅ ๋จผ ๋ ธ๋ โ ์ต๋ ๊ฑฐ๋ฆฌ) |
| ์๋ฃ๊ตฌ์กฐ | ์ธ์ ๋ฆฌ์คํธ(List |
| ํต์ฌ ๋ก์ง | DFS๋ก ๊ฑฐ๋ฆฌ ๋์ ํ๋ฉฐ ๊ฐ์ฅ ๋จผ ๋ ธ๋ ํ์ |
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๋ฐฑ์ค 10800๋ฒ: ์ปฌ๋ฌ๋ณผ (Java) (1) | 2025.06.04 |
|---|---|
| ๋ฐฑ์ค 2294: ๋์ 2(Java) (1) | 2025.06.02 |
| ๋ฐฑ์ค 1976: ์ฌํ ๊ณํ(Java) (0) | 2025.05.24 |
| ํ๋ก๊ทธ๋๋จธ์ค PCCP๋ชจ์๊ณ ์ฌ#1 4๋ฒ๋ฌธ์ (0) | 2025.05.14 |
| ๋ฐฑ์ค 1043๋ฒ: ๊ฑฐ์ง๋ง(java) (1) | 2025.05.07 |