Skip to content
树的直径

树的直径

c++
const int MAXN = 2e5 + 5;

std::vector<int> ver[MAXN];
int dep[MAXN];
int far_node;

void add_edge(int x, int y) {
    ver[x].push_back(y);
    ver[y].push_back(x);
}

void dfs(int x, int fa) {
    if (dep[x] > dep[far_node]) {
        far_node = x;
    }
    for (int y : ver[x]) {
        if (y == fa) continue;
        dep[y] = dep[x] + 1;
        dfs(y, x);
    }
}

int get_tree_diameter(int root, int n) {
    for (int i = 1; i <= n; ++i) dep[i] = 0;
    far_node = root;
    dfs(root, 0);

    int st = far_node;
    for (int i = 1; i <= n; ++i) dep[i] = 0;
    far_node = st;
    dfs(st, 0);

    return dep[far_node];
}