[Baekjoon] 1167๋ฒ: ํธ๋ฆฌ์ ์ง๋ฆ
๐ฅ ๋ฌธ์
https://www.acmicpc.net/problem/1167
๐ ์ค๊ณ
๊ฐ์ง๊ฐ 1์ธ ๋ ธ๋๋ค์์ dfs๋ฅผ ์ด์ฉํ์ฌ ํธ๋ฆฌ์ ์ง๋ฆ์ ๊ตฌํ๋ ค๊ณ ํ๋๋ฐ, ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ์๋ค. ๋์ ํ ํด๊ฒฐ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ด์ ๋ ํผ๋ฐ์ค ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ์๋ค.
์์์ ๋ ธ๋์์ ๊ฐ์ฅ ๋จผ ๋ ธ๋๋ฅผ ๊ตฌํ๊ณ , ๊ทธ ๋ ธ๋์์ ๊ฐ์ฅ ๋จผ ๋ ธ๋๋ฅผ ๊ตฌํ๋ฉด, ํธ๋ฆฌ์ ์ง๋ฆ์ ๊ตฌํ ์ ์๋ค๊ณ ํ๋ค.
์ด๋ป๊ฒ ์ด๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋์ง ๊ณต๋ถํด๋ณธ๋ค.
์์์ ๋ ธ๋๋ฅผ x๋ผ๊ณ ํ๊ณ , x์์ ๊ฐ์ฅ ๋จผ ๋ ธ๋๋ฅผ y๋ผ๊ณ ํ๋ฉด, 3๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์๋ค.
1) x๊ฐ ํธ๋ฆฌ์ ์ง๋ฆ์ ์ ๋ ์ ์ค ํ๋๋ผ๋ฉด, x์์ ๊ฐ์ฅ ๋จผ ๋ ธ๋์ธ y๊ฐ ๋๋จธ์ง ๋ ์ ์ค ํ๋๊ฐ ๋๋ฏ๋ก y์์ ๊ฐ์ฅ ๋จผ ๋ ธ๋(x)๊น์ง์ ๊ฑฐ๋ฆฌ๋ ํธ๋ฆฌ์ ์ง๋ฆ์ด ๋๋ค.
2) y๊ฐ ํธ๋ฆฌ์ ์ง๋ฆ์ ์ ๋ ์ ์ค ํ๋๋ผ๋ฉด, ๋น์ฐํ๊ฒ y์์ ๊ฐ์ฅ ๋จผ ๋ ธ๋๊น์ง์ ๊ฑฐ๋ฆฌ๊ฐ ํธ๋ฆฌ์ ์ง๋ฆ์ด ๋๋ค.
3) y๊ฐ ํธ๋ฆฌ์ ์ง๋ฆ๊ณผ ์๊ด์๊ณ , ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ํธ๋ฆฌ์ ์ง๋ฆ์ u-v์ด๊ณ , x-y์ u-v๊ฐ ๊ต์ฐจ์ t๋ฅผ ๊ฐ์ง๋ค๊ณ ํ์. x์์ ๊ฐ์ฅ ๋จผ ๋ ธ๋๊ฐ y๋ผ๊ณ ํ๋๋ฐ, ์ด๋ ๋ชจ์์ด๋ค. x์์ ๊ฐ์ฅ ๋จผ ๋ ธ๋๊น์ง์ ๊ฒฝ๋ก๋ ํธ๋ฆฌ์ ์ง๋ฆ์ ๊ตฌ์ฑํ๋ x-t-u ๋๋ x-t-v๊ฐ ๋์ด์ผ ํ ๊ฒ์ด๋ค. y๊ฐ ๊ฐ์ฅ ๋จผ ๋ ธ๋๋ผ๋ฉด, ํธ๋ฆฌ์ ์ง๋ฆ์ u-t-y ๋๋ v-t-y๊ฐ ๋์ด์ผ ํ๋ค. ํ์ง๋ง, y๋ ํธ๋ฆฌ์ ์ง๋ฆ๊ณผ ์๊ด์๋ค๊ณ ๊ฐ์ ํ์ผ๋ฏ๋ก ๋ชจ์์ด๋ค.

์ ์กฐ๊ฑด์ ์ ์งํ๋ฉด์ ๋ง์ฝ ๊ต์ฐจ์ ์ด ์๋ ๊ฒฝ์ฐ, ๊ทธ๊ฑด ํธ๋ฆฌ๊ฐ ์๋๋ค.
๋ฐ๋ผ์ ๊ฒฐ๋ก ์ y๋ ํธ๋ฆฌ์ ์ง๋ฆ์ ์ด๋ฃจ๋ ์ ๋ ์ ์ค ํ๋์ผ ์ ๋ฐ์ ์๋ค.
๐ ํ์ด
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int v, start, endd, cost, max_node, result = 0;
vector<vector<pair<int, int>>> adj_list(100001);
vector<bool> visited(100001,false);
void dfs(int cur_node, int cur_cost) {
if (result < cur_cost) {
result = cur_cost;
max_node = cur_node;
}
for (int i = 0; i < adj_list[cur_node].size(); i++) {
int next_node = adj_list[cur_node][i].first;
int next_cost = adj_list[cur_node][i].second;
if (!visited[next_node]) {
visited[next_node] = true;
dfs(next_node, cur_cost + next_cost);
visited[next_node] = false;
}
}
}
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> v;
for (int i = 0; i < v; i++) {
cin >> start;
while (true) {
cin >> endd;
if (endd == -1) {
break;
}
cin >> cost;
adj_list[start].push_back({ endd, cost });
}
}
visited[1] = true;
dfs(1, 0);
visited[1] = false;
visited[max_node] = true;
dfs(max_node, 0);
visited[max_node] = false;
cout << result << "\n";
return 0;
}
๐ ๋ ํผ๋ฐ์ค
ํธ๋ฆฌ์ ์ง๋ฆ ๊ตฌํ๊ธฐ
ํธ๋ฆฌ์์ ์ง๋ฆ์ด๋, ๊ฐ์ฅ ๋จผ ๋ ์ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ ํน์ ๊ฐ์ฅ ๋จผ ๋ ์ ์ ์ ์ฐ๊ฒฐํ๋ ๊ฒฝ๋ก๋ฅผ ์๋ฏธํ๋ค. ์ ํ ์๊ฐ์์ ํธ๋ฆฌ์์ ์ง๋ฆ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค: 1. ํธ๋ฆฌ์์ ์์์ ์ ์ $x$๋ฅผ
blog.myungwoo.kr
https://blogshine.tistory.com/111
[์๊ณ ๋ฆฌ์ฆ] ํธ๋ฆฌ์ ์ง๋ฆ : Diameter of Tree
ํธ๋ฆฌ์ ์ง๋ฆ ์ด๋? " data-ke-type="html"> HTML ์ฝ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐํ ์ ์๋ ์์ค ํธ๋ฆฌ์ ์ง๋ฆ์ ๋๊ฐ์ ๋ง๋จ๋ ธ๋๊ฐ์ ์ต์ฅ๊ฑฐ๋ฆฌ๋ฅผ ์๋ฏธํ๋ค. ๊ฐ๊ฐ์ ์ ์ ์ u, v ๋ผ๊ณ ํ๋ค๋ฉด ์ด๋ค๊ฐ์ ๊ฑฐ๋ฆฌ๋ d(u, v) ๋ผ๊ณ ํจ
blogshine.tistory.com