1967번: 트리의 지름
파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연
www.acmicpc.net
이전에 풀었던 문제와 같은 방식의 문제였고, 재수강 중인 자료구조 강의의 오늘자 과제와 유사해서 금방 푼 문제.
BOJ 1167 : 트리의 지름 [C++]
문제 문제를 읽고 생각난 건 두 가지였다. 그래프 DFS 그래서 dfs를 구현하고, 전체 정점에 대해서 dfs를 수행했다가 시간 초과로 틀렸다. 입력 vertex의 범위가 2개에서 10만 개였기 때문에, 시간 초
poops-here.tistory.com
루트에서 dfs 한번, 그리고 루트에서 최대 거리가 나오는 노드에서 dfs 한번 더.
#include <iostream>
#include <vector>
std::vector<std::pair<int, int>> edges[10001];
bool visited[10001] = {false, };
int max_dist = 0;
int max_node = 0;
void dfs(int start, int dist) {
visited[start] = true;
if (dist > max_dist) {
max_dist = dist;
max_node = start;
}
for (int i = 0; i < edges[start].size(); i++) {
if (visited[edges[start][i].first]) {
continue;
}
dfs(edges[start][i].first, dist + edges[start][i].second);
}
}
int main() {
int n = 0;
std::cin >> n;
for (int i = 0; i < n - 1; i++) {
int parent = 0, child = 0, weight = 0;
std::cin >> parent >> child >> weight;
edges[parent].push_back({child, weight});
edges[child].push_back({parent, weight});
}
dfs(1, 0);
for (int i = 1; i < n + 1; i++) {
visited[i] = false;
}
dfs(max_node, 0);
std::cout << max_dist << "\n";
return 0;
}
'PS > BOJ' 카테고리의 다른 글
BOJ 2096: 내려가기 [C++] (0) | 2022.11.25 |
---|---|
BOJ 1991 : 트리 순회 [C++] (0) | 2022.11.24 |
BOJ 1916 : 최소비용 구하기 [C++] (0) | 2022.11.18 |
BOJ 1865 : 웜홀 [C++] (0) | 2022.11.11 |
BOJ 1238 : 파티 [C++] (0) | 2022.11.10 |