1 solutions

  • 0
    @ 2025-11-5 16:38:27

    C++ :

    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <climits>
    #include <algorithm>
    using namespace std;
    typedef long long LL;
    int N=0,M=0,r1=0,r2=0,Q=0,Deep=0;
    
    int F[100010]={0},D[100010]={0};
    inline int find(int x){
    	if(F[x]!=x) F[x]=find(F[x]);
    	return F[x];
    }
    inline bool Union(int x,int y){
        r1=find(x); r2=find(y);
        if(r1==r2) return false;
        else{ F[r2]=r1; return true; }
    }
    
    class node{
    	public:
    		int s,t,v;
    		bool operator < (const node& b) const {
    			return v<b.v;
    		}
    }E[400010];
    
    class data{
    	public:
    		int to,next,v;
    }T[400010];
    int line[400010]={0},tot=0;
    inline void Insert(int x,int y,int v){
       tot++; T[tot].to=y; T[tot].v=v; T[tot].next=line[x]; line[x]=tot;
    }
    
    int W[300010][25]={0};
    int Fa[300010][25]={0};
    void Build(int x,int deep){
    	D[x]=deep;
    	for(int i=line[x];i!=0;i=T[i].next){
    		int p=T[i].to;
    		if(!Fa[p][0]){
    			Fa[p][0]=x; W[p][0]=T[i].v; Build(p,deep+1);
    		}
    	}
    }
    
    int LCA(int x,int y){
    	int Res=INT_MIN;
    	if(D[x]<D[y]) swap(x,y);
    	for(int j=Deep-1;j>=0;--j){
    		if(D[Fa[x][j]]>=D[y]){
    			Res=max(Res,W[x][j]); x=Fa[x][j];
    		}
    	}
    	if(x!=y){
    		for(int j=Deep-1;j>=0;--j){
    			if(Fa[x][j]!=Fa[y][j]){
    				Res=max(Res,max(W[x][j],W[y][j]));
    				x=Fa[x][j]; y=Fa[y][j];
    			}
    		}
    		Res=max(Res,max(W[x][0],W[y][0]));
    	}
    	return Res;
    }
    
    int main(){
        //freopen("truck.in","r",stdin);
    	//freopen("truck.out","w",stdout);
    
    	scanf("%d%d",&N,&M);
    	Deep=(int)(log((double)N)/log(2.0))+1;
    	int x=0,y=0,v=0;
    	for(int i=1;i<=M;++i){
    		scanf("%d%d%d",&x,&y,&v);
    		E[i].s=x; E[i].t=y; E[i].v=v;
    	}
    	sort(E+1,E+M+1);
    	for(int i=1;i<=N;++i) F[i]=i;
    	for(int i=1;i<=M;++i){
    		if(Union(E[i].s,E[i].t)){
    			Insert(E[i].s,E[i].t,E[i].v);
    			Insert(E[i].t,E[i].s,E[i].v);
    		}
    	}
    	for(int i=1;i<=N;++i){
    		if(!Fa[i][0]){
    			W[i][0]=INT_MIN; Fa[i][0]=i; Build(i,1);
    		}
    	}
    	for(int j=1;j<Deep;++j){
    		for(int i=1;i<=N;++i){
    			Fa[i][j]=Fa[Fa[i][j-1]][j-1];
    			W [i][j]=max(W[i][j-1],W[Fa[i][j-1]][j-1]);
    		}
    	}
    
    	scanf("%d",&Q);
    	x=0,y=0;
    	for(int i=1;i<=Q;++i){
    		scanf("%d%d",&x,&y);
    		if(find(x)!=find(y)) puts("impossible");
    		else printf("%d\n",LCA(x,y));
    	}
    	return 0;
    }
    
    • 1

    Information

    ID
    17892
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By