爆0代码,在线求调,调过有奖励
查看原帖
爆0代码,在线求调,调过有奖励
852827
Mr_yeh楼主2024/11/28 19:21
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=(int)2e5+30;
const int INF=(int)1e15+10;
int head[N],to[N],nxt[N],Fa[N],fa[N][30],d[N],v[N],cnt;
bool vis[N];
int w[N][30],p[N][30];
struct node{
	int a,b,c;
}e[N];
int find(int x){return Fa[x]==x?x:find(Fa[x]);}
void add(int a,int b,int c){
	v[cnt]=c;
	to[cnt]=b;
	nxt[cnt]=head[a];
	head[a]=cnt++;
}
bool cmp(node x,node y){return x.c>y.c;}
void dfs(int node){
    vis[node]=true;
    for(int i=head[node];i;i=nxt[i]){ 
        int To=to[i];
        if(vis[To]) continue;
        d[To]=d[node]+1; 
        fa[To][0]=node;
        w[To][0]=v[i];
        dfs(To);
    }
    return;
}
int lca(int x,int y){
    if(find(x)!=find(y)) return -1; 
    int ans=INF;
    if(d[x]>d[y]) swap(x,y); 
    for(int i=25;i>=0;i--){
        if(d[fa[y][i]]>=d[x]){
            ans=min(ans,w[y][i]);  
            y=fa[y][i];
        }
    }
    if(x==y) return ans; 
    for(int i=25;i>=0;i--){
        if(fa[x][i]!=fa[y][i]){
            ans=min(ans,min(w[x][i],w[y][i]));
            x=fa[x][i]; 
            y=fa[y][i]; 
        }
    }
    ans=min(ans,min(w[x][0],w[y][0]));
    return ans;
}
signed main(){
	int n,m;
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=m;i++){
		int x,y,z;
		scanf("%lld%lld%lld",&x,&y,&z);
		e[i]={x,y,z};
	}
	for(int i=1;i<=n;i++) Fa[i]=i;
	sort(e+1,e+n+1,cmp);
	for(int i=1;i<=n;i++){
		int tx=find(e[i].a),ty=find(e[i].b);
		if(tx!=ty){
			Fa[tx]=ty;
			add(e[i].a,e[i].b,e[i].c);
			add(e[i].b,e[i].a,e[i].c);
		}
	}
	for(int i=1;i<=n;i++){
		if(!vis[i]){
	        d[i]=1; 
	        dfs(i);
	        fa[i][0]=i;
	        w[i][0]=INF;
	    }
	}
	for(int i=1;i<=25;i++){
	    for(int j=1;j<=n;j++){
	        fa[j][i]=fa[fa[j][i-1]][i-1]; 
	        w[j][i]=min(w[j][i-1],w[fa[j][i-1]][i-1]);
	    }
	}
	int q;
	scanf("%lld",&q);
	while(q--){
		int x,y;
		scanf("%lld%lld",&x,&y);
		printf("%lld\n",lca(x,y));
	}
	return 0;
}
2024/11/28 19:21
加载中...