Hướng dẫn cho Khoảng cách dài nhất


Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.

Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.

Authors: cuberlong

C++
#include <bits/stdc++.h>                                                                                                                                                                                      //Logm
using namespace std;
#define int long long

template<class X, class Y> bool maxi(X& x, const Y y) {
    if (x < y) return x = y, 1;
    return 0;
}

const int N = 2e5+5;
int n;
vector<int> adj[N];

int mx1[N]; // mx1[u] là độ dài đường đi dài nhất từ u trong cây con gốc u
int mx2[N]; // mx1[u] là độ dài đường đi dài nhì từ u trong cây con gốc u
int c[N]; // c[u] = v tương ứng nằm trên đường đi dài nhất từ u
void dfs(int u, int par) {
    mx1[u] = 0;
    mx2[u] = 0;
    for (int v: adj[u]) if (v != par) {
        dfs(v, u);
    }
    for (int v: adj[u]) if (v != par) {
        if (mx1[u] <= mx1[v] + 1) {
            c[u] = v;
            maxi(mx2[u], mx1[u]);
            mx1[u] = mx1[v] + 1;
        }
        else maxi(mx2[u], mx1[v] + 1);
    }
    cout << u << ' ' << mx1[u] << ' ' << mx2[u] << ' ' << c[u] << '\n';
}

void dfs2(int u, int par) {
    for (int v: adj[u]) if (v != par) {
        if (v == c[u]) {
            if (mx1[v] <= mx2[u] + 1) {
                maxi(mx2[v], mx1[v]);
                mx1[v] = mx2[u] + 1;
                c[v] = u;
            } else
                maxi(mx2[v], mx2[u] + 1);
        } else {
            if (mx1[v] <= mx1[u] + 1) {
                maxi(mx2[v], mx1[v]);
                mx1[v] = mx1[u] + 1;
                c[v] = u;
            } else
                maxi(mx2[v], mx1[u] + 1);
        }
        dfs2(v, u);
    }
    cout << u << ' ' << mx1[u] << '\n';
}
signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    if (fopen("_ab.inp", "r")) {
        freopen("_ab.inp", "r", stdin);
        freopen("_ab.out", "w", stdout);
    }

    cin >> n;
    for (int i = 2; i <= n; ++i) {
        int u, v; cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    dfs(1, 0);
    dfs2(1, 0);

    return 0;
}

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.