全RE求助
查看原帖
全RE求助
477737
quyy06楼主2021/8/13 11:24
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int N=10005;
const int inf=0x3f3f3f3f;
int n,m,q,f[N],fa[N][25],dep[N],cnt,ans,lg[N],l[N][25];
struct node{
    int v,w;
    node(){}
    node(int vv,int ww){v=vv,w=ww;}
};
vector<node> G[N];
struct po{int u,v,w;}a[50005];
bool cmp(po x,po y){return x.w>y.w;}
int find(int x){
    if(f[x]==x) return x;
    return f[x]=find(f[x]);
}
void kruskal(){
    for(int i=1;i<=m;i++){
        int un=find(a[i].u),vn=find(a[i].v);
        if(un==vn) continue;
        f[vn]=un;
        G[a[i].u].push_back(node(a[i].v,a[i].w));
        G[a[i].v].push_back(node(a[i].u,a[i].w));
        if(++cnt==n-1) return;
    }
}
void dfs(int now,int d){
    dep[now]=dep[d]+1;
    fa[now][0]=d;
    for(int i=1;i<=lg[dep[now]];i++){
        fa[now][i]=fa[fa[now][i-1]][i-1];
        l[now][i]=l[l[now][i-1]][i-1];
    }
    for(int i=0;i<G[now].size();i++){
        int y=G[now][i].v,t=G[now][i].w;
        if(y==d) continue;
        l[y][0]=t;
        dfs(y,now);
    }
}
int lca(int u,int v){
    if(find(u)!=find(v)) return -1;
    ans=inf;
    if(dep[u]<dep[v]) swap(u,v);
    while(dep[u]>dep[v]){
        ans=min(ans,l[u][lg[dep[u]-dep[v]]-1]);
        u=fa[u][lg[dep[u]-dep[v]]-1];
    }
    if(u==v) return ans;
    for(int i=lg[dep[u]]-1;i>=0;i--)
        if(fa[u][i]!=fa[v][i]){
            ans=min(ans,min(l[u][i],l[v][i]));
            u=fa[u][i];
            v=fa[v][i];
        }
    ans=min(ans,min(l[u][0],l[v][0]));
    return ans;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        f[i]=i;
        lg[i]=lg[i-1]+(1<<lg[i-1]==i);
    }
    for(int i=1;i<=m;i++) scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
    sort(a+1,a+1+m,cmp);
    kruskal();
    dfs(1,0);
    scanf("%d",&q);
    for(int i=1;i<=q;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        printf("%d\n",lca(u,v));
    }
    return 0;
}
2021/8/13 11:24
加载中...