본문 바로가기

알고리즘/백준

[백준] 1967번 트리의 지름

반응형

1967번 트리의 지름


1. 이해하기

  • 트리의 지름은 트리에 존재하는 모든 경로들 중에서 가장 긴 것의 길이를 말한다.
  • 가중치가 있는 간선들로 주어진다.

2. 구현하기

  • dfs를 이용해 루트로부터 제일 멀리 떨어진 노드 하나를 먼저 찾는다. 그 이후 이 노드로부터 가장 멀리 떨어진 노드를 찾고 그 때의 길이를 구한다.

    void dfs(int here, int cost) {
        visited[here] = true;
        if(ans < cost) {
            ans = cost;
            endPoint = here;
        }
    
        for(int i = 0; i < adj[here].size(); i++) {
            INF there = adj[here][i];
            if(visited[there.next]) continue;
            dfs(there.next,cost+there.cost);
        }
    }

3. 전체 코드

#include <iostream>
#include <vector>
using namespace std;
struct INF{
    int next,cost;
};
vector<INF> adj[10001];
bool visited[10001];
int ans,endPoint;
void dfs(int here, int cost) {
    visited[here] = true;
    if(ans < cost) {
        ans = cost;
        endPoint = here;
    }

    for(int i = 0; i < adj[here].size(); i++) {
        INF there = adj[here][i];
        if(visited[there.next]) continue;
        dfs(there.next,cost+there.cost);
    }
}

int main() {
    int N;
    cin >> N;
    for(int i = 0; i < N-1; i++) {
        int from,to,cost;
        cin >> from >> to >> cost;
        adj[from].push_back({to,cost});
        adj[to].push_back({from,cost});
    }
    dfs(1,0);
    ans = 0;
    for(int i = 0; i <= 10000; i++) visited[i] = false;
    dfs(endPoint,0);
    cout << ans << '\n';
    return 0;
}

루트 노트에서 dfs 한번, 여기에서 찾은 노드에서 dfs 다시 한번을 수행해야하기 때문에 인접리스트에 거꾸로도 갈 수 있도록 만들어 준다.

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 2873번 롤러코스터  (0) 2019.12.11
[백준] 2098번 외판원 순회  (0) 2019.11.13
[백준] 17822번 원판 돌리기  (0) 2019.10.24
[백준] 17142번 연구소 3  (0) 2019.10.14
[백준] 17140번 이차원 배열과 연산  (0) 2019.10.14