※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 1595번 문제인 북쪽나라의 도로이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/1595 

 

1595번: 북쪽나라의 도로

입력은 여러줄에 걸쳐 주어진다. 입력의 각 줄은 세 개의 양의 정수로 구성되어있는데, 각각은 차례대로 서로 다른 두 도시의 번호와 두 도시를 연결하는 도로의 길이를 의미한다. 모든 도로는

www.acmicpc.net

트리의 지름을 구하는 문제이다. 이 문제에서는 dp를 이용하여 트리의 지름을 구해보았다.

 

트리의 한 노드(1번)을 루트로 잡고, 다음과 같은 규칙을 생각하여 dp를 하자:

"현재 노드를 루트로 하는 서브트리에서, 이 루트를 지나는 최장경로의 길이는 가장 긴 두개의 자식방향의 경로 2개의 길이의 합과 같다"

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;

vector<pair<int, ll>> G[10001];
bool visited[10001];

ll ans = 0;
ll dfs(int current, int parent) {
	ll ret1 = 0, ret2 = 0;
	for (auto np : G[current]) {
		int node = np.first; ll d = np.second;
		if (node == parent) continue;
		d += dfs(node, current);
		if (d > ret1) {
			ret2 = ret1; ret1 = d;
		}
		else if (d > ret2) ret2 = d;
	}
	ans = max(ans, ret1 + ret2);
	return ret1;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int x, y; ll d;
	while (cin >> x >> y >> d) {
		G[x].push_back({ y,d });
		G[y].push_back({ x,d });
	}

	dfs(1, 0);

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 8111 // C++] 0과 1  (0) 2021.10.11
[BOJ 2800 // C++] 괄호 제거  (0) 2021.10.10
[BOJ 5913 // C++] 준규와 사과  (0) 2021.10.08
[BOJ 11062 // C++] 카드 게임  (0) 2021.10.07
[BOJ 2468 // C++] 안전 영역  (0) 2021.10.06

+ Recent posts