[BOJ] 1167번 트리의 지름 - C++

"트리"

Posted by Yongmin on August 18, 2021

문제

트리의 지름

풀이

트리의 지름은 어떤 정점에서 다른 정점까지 최대 거리를 의미한다. 지름을 찾기 위한 알고리즘은 어떤 임의의 정점에서 최대 거리로 떨어진 정점을 찾고, 한번 더 최대 거리 떨어진 정점에서 시작하여 최대 거리로 떨어진 다른 정점을 찾아서 그 거리가 곧 트리의 지름이 된다.

소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <vector>
#include <cstring>

using namespace std;

int N, max_dist, max_node;

vector<pair<int, int>> map[100001];
bool visited[100001];

void dfs(int start, int curr_dist){
    if(visited[start] == true){
        return;
    }
    visited[start] = true;
    if(max_dist < curr_dist){
        max_dist = curr_dist;
        max_node = start;
    }
    for(int i = 0; i<map[start].size(); i++){
        int next = map[start][i].first;
        int dist = map[start][i].second;
        if(visited[next] == false){
            dfs(next, curr_dist + dist);
        }
    }
}
int main(){
    scanf("%d", &N);
    
    for(int i = 0; i<N; i++){
        int from, to, value;
        scanf("%d", &from);
        while(1){
            scanf("%d", &to);
            if(to == -1) break;
            scanf("%d", &value);
            
            map[from].push_back(make_pair(to, value));
        }
    }
    
    dfs(1, 0);
    memset(visited, false, sizeof(visited));
    dfs(max_node, 0);
    
    printf("%d\n", max_dist);
    
    
}


# # #