본문 바로가기
카테고리 없음

[BOJ] 1167. 트리의 지름

by r4bb1t 2023. 4. 1.
반응형

https://www.acmicpc.net/problem/1167

 

1167번: 트리의 지름

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

www.acmicpc.net

트리의 지름이란, 트리에서 임의의 두 점 사이의 거리 중 가장 긴 것을 말합니다. 트리의 지름을 구하는 기본 알고리즘은 다음과 같습니다.

  1. 임의의 한 노드 A를 선택합니다.
  2. 노드 A에서 가장 먼 노드 B를 찾습니다.
  3. 노드 B에서 가장 먼 노드 C를 찾습니다.
  4. 노드 B와 노드 C 사이의 경로의 길이가 트리의 지름입니다.

더 긴 지름이 존재한다면 모순임을 보이면 증명됩니다.

코드는 다음과 같이 작성해 보았습니다.

#include <bits/stdc++.h>

using namespace std;

int v;
vector<pair<int, int>> tree[100001];
bool visited[100001];
pair<int, int> r = {1, 0};

void getFar(int i, int p)
{
    visited[i] = true;
    if (r.second < p)
        r = {i, p};
    for (auto [ii, pp] : tree[i])
    {
        if (visited[ii])
            continue;
        getFar(ii, p + pp);
    }
    visited[i] = false;
}

int main()
{
    cin >> v;
    for (int i = 0; i < v; i++)
    {
        int a, b = 0, c;
        cin >> a;
        while (b != -1)
        {
            cin >> b;
            if (b == -1)
                break;
            cin >> c;
            tree[a].push_back({b, c});
        }
    }
    getFar(1, 0);
    r.second = 0;
    getFar(r.first, 0);
    cout << r.second;
}

DFS를 두 번 이용하는 코드로, 첫 번째 DFS에서는 임의의 노드 (1번 노드)에서 가장 먼 노드를 찾아 r에 넣고, 해당 노드에서 다시 DFS를 돌려서 가장 먼 노드를 찾습니다. 이 때의 경로의 길이가 트리의 지름입니다.

관련 문제

[BOJ] 1967.트리의 지름

 

1967번: 트리의 지름

파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연

www.acmicpc.net

 

반응형

댓글