코딩 공부/백준

[백준][C++] 1167 트리의 지름

김 정 환 2021. 3. 17. 22:19
반응형

www.acmicpc.net/problem/1167

 

1167번: 트리의 지름

트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지

www.acmicpc.net

 

 

 

알고리즘 종류

    - 트리

    - DFS

 

 

 

사고 과정

    - 트리에서 임의의 두 점 사이의 거리 중 가장 긴 것을 찾기 위해서 간단한 것부터 생각해보자. 노드 간에 이동거리가 모두 1이라고 해보자.

        * 아래 예시를 보자. 임의의 노드에서 출발하자. 본인은 노드 4를 골랐다. 노드 4에서 출발하여 가장 깊은 곳은 어딜까? 1이다. 그러면 이제 1에서 출발해보자.

        * 노드 1에서 출발해서 가장 깊은 곳은 어딜까? 2와 5이다. 이렇게, 트리의 지름을 구할 수 있다. 그렇다면, 여기에 가중치를 넣어주자. 

 

        * 간선에 가중치를 넣었다. 출제된 문제와 동일하다. 가중치를 더하면서 최고 값과 비교하면 된다. 과정을 위와 동일하다.

 

 

 

구현(C++)

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
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <cstring>
#include <vector> 
 
using namespace std;
 
int v;
vector<vector<pair<intint> > > info;
int maxNum = 0;
int start;
 
int isVisited[100001];
 
void dfs(int here, int cost){
    
    if(maxNum < cost){
        maxNum = cost;
        start = here;
    }
    
    for(int i=0; i<info[here].size(); i++){
        int next = info[here][i].first;
        int next_cost = info[here][i].second;
        
        if(isVisited[next]) continue;
        isVisited[next] = 1;
        dfs(next, cost + next_cost);
        isVisited[next] = 0;
    }
}
 
 
int main(void){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> v;
    info.resize(v+1);
    
    int num, node, cost;
    for(int i=0; i<v; i++){
        cin >> num;
        
        while(true){
            cin >> node;
            if(node == -1break;
            cin >> cost;
            
            info[num].push_back({node, cost});
        }
    }
    
    isVisited[1= 1;
    dfs(10);
    
    memset(isVisited, 0sizeof(isVisited));
    isVisited[start] = 1;
    dfs(start, 0);
    
    cout << maxNum;
}
 
 
cs

 

 

 

시행착오

반응형

'코딩 공부 > 백준' 카테고리의 다른 글

[백준][C++] 10217 KCM Travel  (0) 2021.03.19
[백준][C++] 9370 미확인 도착지  (0) 2021.03.18
[백준][C++] 10711 모래성  (0) 2021.03.17
[백준][C++] 5014 스타트링크  (0) 2021.03.16
[백준][C++] 1800 인터넷 설치  (0) 2021.03.16