상세 컨텐츠

본문 제목

백준 1967 - 트리의 지름(C++)

알고리즘/문제

by deulee 2023. 5. 24. 18:56

본문

문제

사이클이 없는 무방향 그래프 트리(tree)가 주어질 때 트리의 지름을 구하는 문제다.

 

입력

첫째 줄에 노드의 개수 N (1 <= N <= 10,000)가 입력된다.

 

둘째 줄 부터 N - 1개의 줄에 각 간선에 대한 정보가 입력된다.

 

예제 입력

12
1 2 3
1 3 2
2 4 5
3 5 11
3 6 9
4 7 1
4 8 7
5 9 15
5 10 4
6 11 6
6 12 10

 

예제 출력

45

 

문제 해결

 

어디서 힌트를 얻을 수 있을까?

 

'그래프', '트리', '트리의 지름'이라는 키워드를 본 순간 이 문제는 트리의 지름을 구하는 이론을 이용해서 문제를 풀면 된다는 것을 알 수 있었다.

 

그리고 '간선의 가중치'를 보고 이 문제는 DFS를 이용해야 한다는 것도 눈치챌 수 있었다.

 

코드

#include <iostream>
#include <vector>
#include <utility>
#include <cstring>

typedef std::pair<int, int> P;

std::vector<P > varr[10001];
int maxNode, maxDis;
int cache[10001];

void dfs(int S, int dis)
{
	if (cache[S] != 0)
		return;
	cache[S] = 1;
	if (maxDis < dis)
	{
		maxNode = S;
		maxDis = dis;
	}
	for (int i = 0; i < varr[S].size(); i++)
		dfs(varr[S][i].first, varr[S][i].second + dis);
}

int main(void)
{
	int N;
	std::cin >> N;
	int X, Y, C;
	int ret;
	while (1)
	{
		if (!(std::cin >> X >> Y >> C))
			break ;
		varr[X].push_back(P(Y, C));
		varr[Y].push_back(P(X, C));
	}
	dfs(1, 0);
	std::memset(cache, 0, sizeof(cache));
	maxDis = 0;
	dfs(maxNode, 0);
	std::cout << maxDis << std::endl;
	return 0;
}

 

문제 출처

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

 

1967번: 트리의 지름

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

www.acmicpc.net

 

이론

https://deulee.tistory.com/8

 

트리의 지름 증명

우선 선형 시간안에 트리의 지름을 구하는 방법은 다음과 같다. 트리에서 임의의 정점 X를 정한다. 정점 X에서 가장 먼 정점 Y를 구한다. 정점 Y에서 가장 먼 정점 Z를 구한다. 즉, 트리의 지름은

deulee.tistory.com

 

'알고리즘 > 문제' 카테고리의 다른 글

백준 2096 - 내려가기(C++)  (0) 2023.05.24
백준 1991 - 트리 순회(C++)  (2) 2023.05.24
백준 1932 - 정수 삼각형(C++)  (0) 2023.05.24
백준 1918 - 후위 표기식(C++)  (0) 2023.05.24
백준 1916 - 최소비용 구하기(C++)  (0) 2023.05.23

관련글 더보기