90分(悲)dfs+lca
查看原帖
90分(悲)dfs+lca
676590
HenryQ2022楼主2023/10/29 19:29
#include <iostream>
#include <vector>
using namespace std;

int n, m, rt;
vector<int> e[500010];
int dd[5000010], f[500010];
bool vis[500010];
void dfs(int k, int dep) {
    vis[k] = true;
    dd[k] = dep;
    for(auto i:e[k]) {
        if(vis[i] == false) {
            f[i] = k;
            dfs(i, dep + 1);
        }
    }
}
int lca(int u, int v) {
    while(dd[u] > dd[v])
        u = f[u];
    while(dd[u] < dd[v])
        v = f[v];
    while(u != v)
        u = f[u], v = f[v];
    return u;
}
int main() {
    cin >> n >> m >> rt;
    for(int i = 2;i <= n;i++) {
        int u, v;
        cin >> u >> v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    dfs(rt, 0);
    for(int i = 1;i <= /*n*/m;i++) {
        int a, b;
        cin >> a >> b;
        cout << lca(a, b) << "\n";
        //cout << f[i] << "\n";
    }
    return 0;
}
2023/10/29 19:29
加载中...