kruskal重构树板子wa了
  • 板块UVA12655 Trucks
  • 楼主Retr0_Gu
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/9/18 17:50
  • 上次更新2023/10/22 18:54:12
查看原帖
kruskal重构树板子wa了
535407
Retr0_Gu楼主2023/9/18 17:50
#include <bits/stdc++.h>
#define x(i) edge1[i].x
#define y(i) edge1[i].y
#define z(i) edge1[i].z
#define to(i) edge2[i].to
#define val(i) edge2[i].val
#define next(i) edge2[i].next
using namespace std;

const int N = 2e4 + 1, M = 1e5 + 1;

struct Edge1{
    int x;
    int y;
    int z;
}edge1[M];

struct Edge2{
    int to;
    int val;
    int next;
}edge2[2 * N];

int tot, cnt, p1[N], head[N], d[N], lg[N], p2[N][15], minw[N][15];

bool cmp(Edge1 l, Edge1 r){
    return l.z > r.z;
}

void init(int n){
    tot = n;
    for (int i = 1; i <= n; i++)
        p1[i] = i;
    cnt = 0;
    memset(head + 1, 0, sizeof(int) * n);
    memset(d + 1, -1, sizeof(int) * n);
    for (int i = 2; i < n; i++)
        lg[i] = lg[i >> 1] + 1;
}

int find(int x){
    if (p1[x] == x) return x;
    return p1[x] = find(p1[x]);
}

void merge(int x, int y){
    p1[find(x)] = find(y);
}

void add_edge(int u, int v, int w){
    to(++cnt) = v;
    val(cnt) = w;
    next(cnt) = head[u];
    head[u] = cnt;
}

void kruskal(int m){
    sort(edge1 + 1, edge1 + m + 1, cmp);
    for (int i = 1; i <= m; i++){
        if (find(x(i)) == find(y(i))) continue;
        merge(x(i), y(i));
        add_edge(x(i), y(i), z(i));
        add_edge(y(i), x(i), z(i));
        if (--tot == 1) break;
    }
}

void BFS(){
    queue<int> q;
    d[1] = 0;
    q.push(1);
    while (!q.empty()){
        int u = q.front();
        q.pop();
        for (int i = head[u]; i; i = next(i)){
            int v = to(i), w = val(i);
            if (d[v] != -1) continue;
            d[v] = d[u] + 1;
            p2[v][0] = u;
            minw[v][0] = w;
            for (int j = 1; j <= lg[d[v]]; j++){
                p2[v][j] = p2[p2[v][j - 1]][j - 1];
                minw[v][j] = min(minw[v][j - 1], minw[p2[v][j - 1]][j - 1]);
            }
            q.push(v);
        }
    }
}

int LCA(int a, int b){
    if (d[a] < d[b]) swap(a, b);
    int ans = INT_MAX;
    while (d[a] != d[b]){
        int i = lg[d[a] - d[b]];
        ans = min(ans, minw[a][i]);
        a = p2[a][i];
    }
    if (a == b) return ans;
    for (int i = lg[d[a]]; i >= 0; i--){
        if (p2[a][i] == p2[b][i]) continue;
        ans = min(ans, min(minw[a][i], minw[b][i]));
        a = p2[a][i], b = p2[b][i];
    }
    return min(ans, min(minw[a][0], minw[b][0]));
}

int main(){
    int n, m, s;
    while (scanf("%d%d%d", &n, &m, &s) != EOF){
        for (int i = 1; i <= m; i++)
            scanf("%d%d%d", &x(i), &y(i), &z(i));
        init(n);
        kruskal(m);
        while (s--){
            int l, h;
            scanf("%d%d", &l, &h);
            printf("%d\n", LCA(l, h));
        }
    }
    return 0;
}
2023/9/18 17:50
加载中...