TLE10分求调
查看原帖
TLE10分求调
1031975
Huchangzhi楼主2025/1/3 20:05
#include <vector>
#include <iostream>
#include <algorithm>
#include <cmath>
#define pi pair<int, int>
#define M 500010
#define N 100010
#define K 20
using namespace std;
int n, m, fa[M], de[M], sum[M][K+2], f[M][K+2], cnt=0;
bool vis[M];
vector<pi> v[M];
struct node{
    int x, y, z;
}sz[M];
bool operator<(node a, node b){
    return a.z > b.z;
}
int getfa(int a){
    if(fa[a] == a){
        return a;
    }
    fa[a] = getfa(fa[a]);
    return fa[a];
}
void add(int x, int y, int z){
    v[x].push_back({y, z});
    v[y].push_back({x, z});
}
void dfs(int u, int fa){
    f[u][0]=fa;
    de[u]=de[fa]+1;
    vis[u]=1;
    for(int j=1;j<=K;j++){
        f[u][j]=f[f[u][j-1]][j-1];
        sum[u][j] = min(sum[u][j-1], sum[f[u][j-1]][j-1]);
    }
    for(pi a : v[u]){
        int y = a.first;
        if(y == fa){
            continue;
        }
        sum[y][0] = a.second;
        dfs(y, u);
    }
}
int lca(int x, int y){
    if(de[x]<de[y])swap(x, y);
    int ans = 1e9;
    for(int i=K;i>=0;i--){
        if(de[f[x][i]] >= de[y]){
            ans = min(ans, sum[x][i]);
            x = f[x][i];
        }
    }
    if(x == y){
        return ans;
    }
    for(int i=K;i>=0;i--){
        if(f[x][i] != f[y][i]){
            ans = min(ans, min(sum[x][i], sum[y][i]));
            x = f[x][i];
            y = f[y][i];
        }
    }
    ans = min(ans, min(sum[x][0], sum[y][0]));
    return ans;
}
int main(){
   
    scanf("%d%d", &n, &m);
    for(int i=1;i<=n;i++){
        fa[i] = i;
    }
    for(int i=1;i<=m;i++){
        scanf("%d%d%d", &sz[i].x, &sz[i].y, &sz[i].z);
    }
    sort(sz+1, sz+m+1);
    int tot = 0;
    for(int i=1;i<=m && tot < n-1;i++){
        int x = getfa(sz[i].x);
        int y = getfa(sz[i].y);
        if(x != y){
            fa[x] = y;
            tot++;
            add(sz[i].x, sz[i].y, sz[i].z);
            add(sz[i].y, sz[i].x, sz[i].z);
        }
    }
   
    for(int i=1;i<=n;i++){
        if(!vis[i]){
            dfs(i, 0);
        }
    } 
    int q;
    scanf("%d", &q);
    for(int i=1;i<=q;i++){
        int x, y;
        scanf("%d%d", &x, &y);
        if(getfa(x) != getfa(y)){
            printf("-1\n");
            continue;
        }
        printf("%d\n", lca(x, y));
    }
    return 0;
}
    
2025/1/3 20:05
加载中...