문제
https://www.acmicpc.net/problem/1967
1967번: 트리의 지름
파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연
www.acmicpc.net
문제 요약
가중치가 있는 트리가 주어졌을 때, 트리의 지름을 출력한다.
트리의 지름이란, 트리에 존재하는 모든 경로들 중 가장 긴 것의 길이이다.
코드
#include<iostream>
#include<vector>
#include<tuple>
#include<cstring>
#define MAX_N 500000
using namespace std;
int n;
bool visited[MAX_N + 1];
vector<tuple<int, int>> edges[MAX_N + 1];
int start_node, max_length, max_node;
void dfs(int x, int dist) {
visited[x] = true;
// 출발 노드에서 가장 먼 노드와 그 노드까지의 거리 갱신
if (max_length < dist) {
max_length = dist;
max_node = x;
}
for (int i = 0; i < edges[x].size(); i++) {
int y, d;
tie(y, d) = edges[x][i];
if (visited[y]) continue;
dfs(y, dist + d);
}
}
int main() {
cin >> n;
// 입력
for (int i = 0; i < n - 1; i++) {
int a, b, w;
cin >> a >> b >> w;
edges[a].push_back({ b, w });
edges[b].push_back({ a, w });
}
// 루트 노드에서 dfs 진행 -> 가장 먼 노드 찾기
dfs(1, 0);
max_length = 0; // 길이 다시 0으로 초기화
memset(visited, false, MAX_N + 1);
// 가장 가장 먼 노드에서 다시 dfs 진행 -> 가장 먼 노드에서 가장 먼 노드 찾기
dfs(max_node, 0);
cout << max_length;
return 0;
}
코드 설명
트리의 지름을 구하는 과정은 다음과 같다.
1. 아무 노드에서 DFS를 이용해 시작점에서 가장 먼 노드를 구한다.
2. 다시 DFS를 이용해 가장 먼 노드에서 가장 먼 노드를 구한다.
3. 두 노드 사이의 거리가 트리의 지름이다.
'Algorithm Problems > 그래프' 카테고리의 다른 글
[백준/C++] 1647번: 도시 분할 계획 (3) | 2024.02.18 |
---|---|
[백준/C++] 1504번: 특정한 최단 경로 (2) | 2024.02.09 |
[백준/C++] 1261번: 알고스팟 (1) | 2024.01.30 |
[백준/C++] 14267번: 회사 문화 1 (0) | 2024.01.16 |
[백준/C++] 4963번: 섬의 개수 (0) | 2024.01.11 |