728x90
url : https://www.acmicpc.net/problem/1967
1967번: 트리의 지름
파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연
www.acmicpc.net
이 문제는 백준 1167 문제의 풀이와 거의 같다.
https://shout-to-my-mae.tistory.com/381
[백준] 1167 : 트리의 지름
url : https://www.acmicpc.net/problem/1167 1167번: 트리의 지름 트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정
shout-to-my-mae.tistory.com
다른 점은 리프 노드에서 리프 노드까지의 dfs를 수행하려면, 리프 노드1 -> 루트 노드 (위로 올라가기), 루트 노드 -> 리프 노드2(아래로 내려가기) 두 작업을 수행해야한다.
그렇기 때문에 자식 노드에서 부모 노드로 이어진 간선도 추가해야한다.
코드
#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int>> tree[10004];
int n, a, b, c, maxDistance, farthestNode;
int visited[10004];
void dfs(int node, int distance){
visited[node]=1;
if (distance > maxDistance){
maxDistance = distance;
farthestNode = node;
}
for (auto &p: tree[node]){
if (visited[p.first]) continue;
dfs(p.first, distance+p.second);
}
}
int main(){
//1. 입력받기
cin >> n;
for (int i=0;i<n-1;i++){
cin >> a>> b>> c;
tree[a].push_back({b, c}); // 부모 노드 -> 자식 노드
tree[b].push_back({a, c}); // 자식 노드 -> 부모 노드
}
//2. 가장 끝 노드 구하기
dfs(1, 0);
//3. 초기화
fill(visited, visited+10004, 0);
maxDistance = 0;
//4. leaf 노드에서 dfs 수행
dfs(farthestNode, 0);
//3. 정답 출력
cout << maxDistance;
}
728x90
'알고리즘 > 알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스] 142086 : 가장 가까운 같은 글자 (0) | 2024.01.13 |
---|---|
[백준] 1865 : 웜홀, 벨만-포드, 최단 경로 알고리즘 비교 (0) | 2024.01.12 |
[백준] 1932 : 정수삼각형 (0) | 2024.01.11 |
[백준] 2749 : 피보나치 수 3 (0) | 2024.01.10 |
[백준] 1918 : 후위 표기식 (2) | 2024.01.09 |