边双求调
查看原帖
边双求调
550471
Ice_function楼主2023/10/6 17:45

如题,可能是重边的问题,已经判过了。

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10;

int n, l;

vector <int> Kg[N];

int dfn[N], low[N], tot, id[N];





stack <int> k;
map <int, map<int, bool> > G;
vector <vector<int> > bccs;

void tarjan(int u, int la) {
    dfn[u] = low[u] = ++tot;
    k.push(u);//
    for (int e : Kg[u]) {
        if (e == la) continue;
        if (!dfn[e]) {//
            tarjan(e, u);
            low[u] = min(low[u], low[e]);
            if (dfn[u] < low[e]) {
                vector <int> bcc;
                while (1) {
                    int r = k.top(); k.pop();
                    bcc.push_back(r);
                    id[r] = bccs.size() + 1;
                    if (r == e) break;//
                }
                bccs.push_back(bcc);
            }
        } else low[u] = min(low[u], dfn[e]);
    }
}
int F[N][25], dep[N];
vector <int> g[N];
void print(int x) {if (x == 1) {cout << 1; return;} if (x == 0) {cout << 0; return;} print(x >> 1); cout << x % 2;}

void dfs(int u, int la) {
    if (u != 1) {
        F[u][0] = la;
        for (int i = 1; i <= 25; i++) F[u][i] = F[F[u][i - 1]][i - 1];
        dep[u] = dep[la] + 1;
    }
    for (int e : g[u]) {
        if (e == la) continue;
        dfs(e, u);
    }
}

int lca(int u, int v) {
    if (dep[u] < dep[v]) swap(u, v); //
    int re = dep[u] - dep[v];
    for (int i = 0; i <= 25; i++) {
        if ((re >> i) & 1) u = F[u][i];
    }
    if (u == v) return u;
    for (int i = 25; i >= 0; i--) {
        if (F[u][i] != F[v][i]) u = F[u][i], v = F[v][i];
    }
    return F[u][0];
}

signed main() {
    scanf("%lld %lld", &n, &l);
    for (int i = 1; i <= l; i++) {
        int u, v;
        scanf("%lld %lld", &u, &v);
        if (G[u][v] || G[v][u]) continue;
        G[u][v] = 1, G[v][u] = 1;
        Kg[u].push_back(v);
        Kg[v].push_back(u);
    }
    for (int i = 1; i <= n; i++) {
        if (!dfn[i]) tarjan(i, 0);
        if (k.size()) {
            vector <int> bcc;
            while (k.size()) {
                int r = k.top(); k.pop();
                bcc.push_back(r);
                id[r] = bccs.size() + 1;
            }
            bccs.push_back(bcc);
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j : Kg[i]) {
            if (id[i] == id[j]) continue;
            g[id[i]].push_back(id[j]);
            //g[id[j]].push_back(id[i]);//
        }
    }
    dfs(1, 0);
    int q;
    scanf("%lld", &q);
    while (q--) {
        int u, v;
        scanf("%lld %lld", &u, &v);
        u = id[u], v = id[v]; //
        int ans = dep[u] + dep[v] - 2 * dep[lca(u, v)] + 1;
        print(ans); cout << endl;
    }
    return 0;
}
2023/10/6 17:45
加载中...