본문 바로가기

Algorithm/BAEKJOON

[BOJ] 1967번 트리의 지름 (C++)

728x90
반응형

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

 

1967번: 트리의 지름

파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연

www.acmicpc.net

 

#include <iostream>
#include <vector>
using namespace std;

int n;
vector<pair<int, int>> tree[10001];
bool visited[10001];

int max_len = 0;
int end_node = 0;

void dfs(int node, int len) {
	if (visited[node]) return;
	visited[node] = true;

	if (len > max_len) {
		max_len = len;
		end_node = node;
	}

	for (int i = 0; i < tree[node].size(); i++) {
		dfs(tree[node][i].first, len + tree[node][i].second);
	}
}

int main()
{
	cin >> n;
	for (int i = 0; i < n - 1; i++) {
		int a, b, c;
		cin >> a >> b >> c;
		tree[a].push_back({ b, c });
		tree[b].push_back({ a, c });
	}

	dfs(1, 0);  // 임의의 정점에서 가장 먼 정점 찾기
	max_len = 0;
	for (int i = 0; i < 10001; i++) visited[i] = false;
	dfs(end_node, 0);  // 위에서 찾은 정점에서 가장 먼 정점 찾기
	cout << max_len << '\n';
}

 

어떤 정점에서 출발해도 가장 멀리 있는 정점은 지름의 끝에 해당하는 두 정점 중 하나이다.

(참고: https://johoonday.tistory.com/224)

따라서 임의의 한 정점에서 dfs를 수행하여 가장 멀리 있는 정점을 찾은 후에

그 지점에서 dfs를 한 번 더 수행해 가장 먼 정점을 찾는다.

728x90
반응형

'Algorithm > BAEKJOON' 카테고리의 다른 글

[BOJ] 5373번 큐빙 (C++)  (1) 2024.02.10
[BOJ] 2961번 도영이가 만든 맛있는 음식 (C++)  (1) 2024.02.01
[BOJ] 16932번 모양 만들기 (C++)  (0) 2024.01.23
[BOJ] 23352번 방탈출 (C++)  (1) 2024.01.22
[BOJ] 3055번 탈출 (C++)  (0) 2024.01.20