사이클이 없는 무방향 그래프 트리(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
트리의 지름 증명
우선 선형 시간안에 트리의 지름을 구하는 방법은 다음과 같다. 트리에서 임의의 정점 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 |