求助,前两个点A了
查看原帖
求助,前两个点A了
323989
Vector_Mingfan楼主2021/8/28 10:19
#include <bits/stdc++.h>
#define N 100005
#define M 30
#define INF 0x7fffffff/2
#define f(x, y) x ^= y, y ^= x, x ^= y

using namespace std;

struct node {
    int x;
    int y;
    int dis;
};
node g[500005];

struct node1 {
    int to;
    int next;
    int w;
};
node1 e[500005];

int cnt, n, m, h[N], f[N], prt[N][M], w[N][M], deep[N];
bool v[N];

inline int read() {
   char ch = getchar();
   int f = 0, w = 1;
   while(ch < '0' || ch > '9') {
     if(ch == '-') w = -1;
     ch = getchar();
   }
   while(ch >= '0' && ch <= '9') {
     f = f * 10 + ch - '0',
     ch = getchar();
   }
   return f * w;
}

inline void Add(int x, int y, int z) {
    cnt++ ;
    e[cnt].next = h[x];
    e[cnt].to = y;
    e[cnt].w = z;
    h[x] = cnt;
}

inline bool cmp(node x, node y) {
    return x.dis > y.dis;
}

inline int find(int x) {
    if (f[x] != x) 
        f[x] = find(f[x]);
    return f[x];
}

inline void k() {
    sort(g + 1, g + m + 1, cmp);
    for (int i=1; i<=n; i++ ) 
        f[i] = i;
    for (int i=1; i<=m; i++ ) {
        if (find(g[i].x) != find(g[i].y)) {
            f[find(g[i].x)] = find(g[i].y);
            Add(g[i].x, g[i].y, g[i].dis);
            Add(g[i].y, g[i].x, g[i].dis);
        }
    }
    return ;
}

inline void dfs(int x) {
    v[x] = 1;
    for (int i=h[x]; i; i=e[i].next) {
        int to = e[i].to;
        if (v[to]) 
            continue;
        deep[to] = deep[x] + 1;
        prt[to][0] = x;
        w[to][0] = e[i].w;
        dfs(to);
    }
    return ;
}

inline int LCA(int a, int b) {
    if (find(a) != find(b)) 
        return -1;
    int ans = INF;
    if (deep[a] > deep[b]) 
        f(a, b);
    for (int i=20; i>=0; i-- ) 
        if (deep[prt[n][i]] >= deep[a]) {
            ans = min(ans, w[b][i]);
            b = prt[b][i];
        }
    if (a == b) 
        return ans;
    for (int i=20; i>=0; i-- ) 
        if (prt[a][i] != prt[b][i]) {
            ans = min(ans, min(w[a][i], w[b][i]));
            a = prt[a][i];
            b = prt[b][i];
        }
    ans = min(ans, min(w[a][0], w[b][0]));
    return ans;
}

inline void st() {
    for (int i=1; i<=n; i++ ) {
        if (!v[i]) {
            deep[i] = 1;
            dfs(i);
            prt[i][0] = i;
            w[i][0] = INF;
        }
    }
}

inline void lcainit() {
    for (int j=1; j<=20; j++ ) {
        for (int i=1; i<=n; i++ ) {
            prt[i][j] = prt[prt[i][j - 1]][j - 1];
            w[i][j] = min(w[i][j - 1], w[prt[i][j - 1]][j - 1]); 
        }
    }
}

int main() {
    n = read();
    m = read();
    for (int i=1; i<=m; i++ ) {
        int x, y, z;
        x = read();
        y = read();
        z = read();
        g[i].x = x;
        g[i].y = y;
        g[i].dis = z;
    }
    k();
    st();
    lcainit();
    int q;
    q = read();
    for (int i=1; i<=q; i++ ) {
        int x, y;
        x = read();
        y = read();
        printf("%d\n", LCA(x, y));
    }
    return 0;
}

最开始全错,看着题解打了一遍还是错的

2021/8/28 10:19
加载中...