15pts求助,其中第三个点605个询问中WA7个询问
查看原帖
15pts求助,其中第三个点605个询问中WA7个询问
475403
Redshift_Shine楼主2023/8/17 09:34
#include<iostream>
#include<tuple>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
const int N=5e5+10;
int n,m,dep[N],fa[N],q,l,r,tx;
using t3i=tuple<int,int,int>;
t3i edge[N];
vector<pair<int,int>> road[N];
int mn[N][30],ft[N][30];
void dfs(int nod,int pr){
    mn[nod][0]=pr;
    for(int i=1;i<=20;i++){
        ft[nod][i]=ft[ft[nod][i-1]][i-1];
        mn[nod][i]=min(mn[nod][i-1],mn[ft[nod][i-1]][i-1]);
    }
    for(auto& [i,v]:road[nod]){
        if(dep[i])continue;
        dep[i]=dep[nod]+1;
        ft[i][0]=nod;
        dfs(i,v);
    }
}
inline int find(int x){
    return x==fa[x]?x:fa[x]=find(fa[x]);
}
inline void merge(int x,int y){
    fa[find(y)]=find(x);
}
inline void adv(int& x,int v){
    for(int i=0;v;i++){
        if(v&1)x=ft[x][i];
        v>>=1;
    }
}
inline int lca(int x,int y){
    if(dep[x]>dep[y])x^=y^=x^=y;
    adv(y,dep[y]-dep[x]);
    for(int i=20;i>=0;i--){
        if(ft[x][i]!=ft[y][i]){
            x=ft[x][i],y=ft[y][i];
        }
    }
    return ft[x][0];
}
inline int fd_mn(int x,int v){
    int res=0x3f3f3f3f;
    for(int i=0;v;i++){
        if(v&1)res=min(res,mn[x][i]),x=ft[x][i];
        v>>=1;
    }
    return res;
}
int main(){
    memset(mn,0x3f,sizeof mn);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)fa[i]=i;
    for(int i=1;i<=m;i++){
        auto& [z,x,y]=edge[i];
        scanf("%d%d%d",&x,&y,&z);
    }
    sort(edge+1,edge+m+1);
    for(int i=m;i;i--){
        auto& [z,x,y]=edge[i];
        if(find(x)==find(y))continue;
        merge(x,y);
        road[x].push_back({y,z}),
        road[y].push_back({x,z});
    }
    for(int i=1;i<=n;i++){
        if(!dep[i])dep[i]=1,dfs(i,0x3f3f3f3f);
    }
    scanf("%d",&q);
    for(int i=1;i<=q;i++){
        scanf("%d%d",&l,&r);
        if(find(l)!=find(r)){
            puts("-1");
            continue;
        }
        tx=lca(l,r);
        printf("%d\n",min(fd_mn(l,dep[l]-dep[tx]),fd_mn(r,dep[r]-dep[tx])));
    }
}
2023/8/17 09:34
加载中...