[BOJ] 1167 : ํธ๋ฆฌ์ ์ง๋ฆ
๋ฌธ์ ๋งํฌ
1167๋ฒ: ํธ๋ฆฌ์ ์ง๋ฆ (acmicpc.net)
1167๋ฒ: ํธ๋ฆฌ์ ์ง๋ฆ
ํธ๋ฆฌ๊ฐ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค. ๋จผ์ ์ฒซ ๋ฒ์งธ ์ค์์๋ ํธ๋ฆฌ์ ์ ์ ์ ๊ฐ์ V๊ฐ ์ฃผ์ด์ง๊ณ (2 ≤ V ≤ 100,000)๋์งธ ์ค๋ถํฐ V๊ฐ์ ์ค์ ๊ฑธ์ณ ๊ฐ์ ์ ์ ๋ณด๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์ฃผ์ด์ง๋ค. ์ ์ ๋ฒํธ๋ 1๋ถํฐ V๊น์ง
www.acmicpc.net
ํ์ด
์์์ ๋ ์ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ์ค ๊ฐ์ฅ ๊ธด ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋ ๋ฌธ์
๋น์ฐํ ๋ฃจํธ๋ ธ๋์์ ํ์์ ์์ํ๋ฉด ๊ฐ์ฅ ๊ธด ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์ ์ ์์ ๊ฒ์ด๋ผ ์๊ฐ.
ํ์ง๋ง ๋ฃจํธ๋ ธ๋์์ ํ์ํ๋ฉด ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ ์ ์๊ฒ ์ง๋ง ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ํ์ํ์ง๋ ๋ชปํ๋ค.
๊ทธ๋ ๋ค๊ณ ๋ชจ๋ ์ ์ ์์ ๋ถํฐ ํ์์ ํ ๊ฒ์ธ๊ฐ?? ๊ทธ๋ผ ์๊ฐ์ด๊ณผ๊ฐ ๋๋ค.
ํด๊ฒฐ
1. ๋ฃจํธ๋ ธ๋์์ ํ์์ ์์ํด ๊ฐ์ฅ ๊น์ ๋ ธ๋๋ฅผ ์ฐพ๋๋ค.
(์ฌ๊ธฐ์ ๊ฐ์ฅ ๊น์ ๋ ธ๋๋ leaf ๋ ธ๋๋ค ์ค ํ๋๊ฐ ๋ ๊ฒ์ด๋ค.)
2. ๊ทธ ๊ฐ์ฅ ๊น์ ๋ ธ๋์์ ๋ค์ ํ์์ ์์ํ๋ค.
์ด๊ฒ ์ด ๋ฌธ์ ์ ํต์ฌ์ด์๋ค. ์ฌ๊ธฐ์ ํ์์ ๊น์ด ์ฐ์ ํ์์ ๋งํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
#include <queue>
#include <climits>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef priority_queue<pair<pair<int,int>, int>, vector<pair<pair<int,int>, int>>, greater<pair<pair<int,int>, int>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 100000 + 5;
int MAX;
int N;
vector<pair<int,int>> Edge[MAX_N];
bool visited[MAX_N];
int parent[MAX_N];
int leaf;
int Find(int x) {
if (parent[x] == x)
return x;
return parent[x] = Find(parent[x]);
}
void Union(int x, int y) {
int parent_x = Find(x);
int parent_y = Find(y);
parent[parent_x] = parent_y;
}
void dfs(int now, int distance) {
visited[now] = true;
if (distance > MAX) {
MAX = distance;
leaf = now;
}
for (int i = 0; i < Edge[now].size(); i++) {
int next = Edge[now][i].first;
int acost = Edge[now][i].second + distance;
if (!visited[next])
dfs(next, acost);
}
}
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> N;
for (int i = 1; i <= N; i++)
parent[i] = i;
for (int i = 1; i <= N; i++) {
int vertex;
cin >> vertex;
while (true) {
int a, b;
cin >> a;
if (a == -1)
break;
cin >> b;
Edge[vertex].push_back({ a,b });
Union(vertex, a);
}
}
dfs(Find(1), 0);
memset(visited, 0, sizeof(visited));
dfs(leaf, 0);
cout << MAX << "\n";
return 0;
}
|
cs |
์ฌ๊ธฐ์ Union_Find๋ ๋ฃจํธ ๋ ธ๋๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค.
๋ฃจํธ๋ ธ๋์์ dfs ํ์์ ์คํํ ํ leaf๋ ธ๋์์ ๋ค์ ํ ๋ฒ dfsํ์์ ์คํํ๋ค.