15pts,最大生成树+LCA在线求助
查看原帖
15pts,最大生成树+LCA在线求助
339568
TonviaSzt楼主2022/6/2 19:31

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e4+5,M=5e4+5;
int n,m,q,fa[N],p[N],dep[N],Fa[N][30],G[N][30];
struct Bian{
    int x,y,z;
    bool operator < (const Bian &T) const{return z>T.z;}
}e[M];
struct qh{
    int v,nt,w;
}E[M];
inline int Rd(){
    int s=0,w=1;char ch=getchar();
    while (ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
    while (ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
    return s*w;
}
inline int Getfa(int x){return fa[x]==x?x:fa[x]=Getfa(fa[x]);}
inline void add(int u,int v,int w){E[++p[0]]=(qh){v,p[u],w};p[u]=p[0];}
inline void Kruskal(){
    sort(e+1,e+m+1);
    for(int i=1;i<=n;i++) fa[i]=i;
    for(int i=1;i<=m;i++){
        int fx=Getfa(e[i].x),fy=Getfa(e[i].y);
        if(fx==fy) continue;
        add(e[i].x,e[i].y,e[i].z);
        add(e[i].y,e[i].x,e[i].z);
        fa[fx]=fy;
    }
    return ;
}
inline void dfs(int u,int fa){
    dep[u]=dep[fa]+1;
    for(int i=1;i<30;i++){
        Fa[u][i]=Fa[Fa[u][i-1]][i-1];
        G[u][i]=min(G[u][i-1],G[Fa[u][i-1]][i-1]);
    }
    for(int i=p[u];i;i=E[i].nt){
        int v=E[i].v;
        if(v==fa) continue;
        Fa[v][0]=u;
        G[v][0]=E[i].w;
        dfs(v,u);
    }
}
inline int query(int x,int y){
    if(Getfa(x)!=Getfa(y)) return -1;
    int mn=G[x][0];
    if(dep[x]<dep[y]) swap(x,y);
    for(int i=29;i>=0;i--){
        if(dep[Fa[x][i]]>=dep[y]){
            mn=min(mn,G[x][i]);
            x=Fa[x][i];
        }
    }
    if(x==y) return mn;
    for(int i=29;i>=0;i--){
        if(Fa[x][i]!=Fa[y][i]){
            mn=min(mn,min(G[x][i],G[y][i]));
            x=Fa[x][i];
            y=Fa[y][i];
        }
    }
    mn=min(mn,min(G[x][0],G[y][0]));
    return mn;
}
int main(){
    freopen("b.in","r",stdin);
    freopen("b.out","w",stdout);
    n=Rd();m=Rd();
    for(int i=1;i<=m;i++) e[i].x=Rd(),e[i].y=Rd(),e[i].z=Rd();
    for(int i=1;i<=n;i++) G[i][0]=1e9,Fa[i][0]=i;
    Kruskal();
    dfs(1,0);
    // for(int i=1;i<=n;i++) if(fa[i]==i) dfs(i,0);
    q=Rd();
    while (q--){
        int x=Rd(),y=Rd();
        printf("%d\n",query(x,y));
    }
    return 0;
}
2022/6/2 19:31
加载中...