[c++] 트리의 지름(Tree Diameter)

서론

트리의 지름이란 트리에서 가장 먼 두 정점 사이의 거리를 의미합니다. 이 글에서는 C++로 트리의 지름을 찾는 방법을 다루겠습니다.

알고리즘 개요

트리의 지름을 찾기 위해 다음 알고리즘을 사용할 것입니다.

  1. 임의의 정점을 선택한 후 가장 먼 정점을 찾습니다.
  2. 해당 정점으로부터 가장 먼 정점을 찾아 거리를 구합니다.

코드 예시

아래는 C++로 트리의 지름을 찾는 코드의 예시입니다.

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

vector<pair<int, int>> tree[100001]; // 각 정점마다 연결된 정점과 가중치
bool visited[100001];
int max_dist, max_node;

void bfs(int start) {
    queue<pair<int, int>> q;
    q.push({start, 0});
    visited[start] = true;

    while (!q.empty()) {
        int cur_node = q.front().first;
        int cur_dist = q.front().second;
        q.pop();

        if (cur_dist > max_dist) {
            max_dist = cur_dist;
            max_node = cur_node;
        }

        for (auto next : tree[cur_node]) {
            int next_node = next.first;
            int next_dist = next.second;

            if (!visited[next_node]) {
                visited[next_node] = true;
                q.push({next_node, cur_dist + next_dist});
            }
        }
    }
}

int findTreeDiameter(int start) {
    max_dist = 0;
    max_node = 0;
    bfs(start);

    fill(visited, visited + 100001, false);

    max_dist = 0;
    bfs(max_node);

    return max_dist;
}

int main() {
    int n;
    cin >> n;

    for (int i = 0; i < n - 1; i++) {
        int v1, v2, w;
        cin >> v1 >> v2 >> w;
        tree[v1].push_back({v2, w});
        tree[v2].push_back({v1, w});
    }

    int diameter = findTreeDiameter(1);
    cout << "트리의 지름: " << diameter << endl;

    return 0;
}

결론

이제 여러분은 C++를 활용하여 트리의 지름을 찾는 방법을 알게 되었습니다. 이를 통해 트리 구조에서의 가장 먼 거리를 계산하는데 도움이 될 것입니다.

참고 자료