没输出,求调,玄关!!!
查看原帖
没输出,求调,玄关!!!
873786
wangjiajinself楼主2025/2/5 20:12
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N=1e4+10,M=5e4+10;
int n,m,s,a,b,tot,dep[N],f[N][41],lg[N],sum[N],ans[N][41],fa[N],c,k;
bool vis[N];
struct node{
	int u,v,w;
}e[M];
vector<node> ad[N];
void add(int u,int v,int w){
	tot++;
	e[tot].u=u;
	e[tot].v=v;
	e[tot].w=w;
}
int getw(int u,int v){
	int l=ad[u].size();
	for(int i=0;i<l;i++){
		if(v==ad[u][i].v){
			return ad[u][i].w;
		}
	}
}
int find(int x){
	if(fa[x]==x) return x;
	fa[x]=find(fa[x]);
	return fa[x];
}
bool cmp(node o,node p){
	return o.w>p.w;
}
void dfs(int x,int fa){
	vis[x]=1;
	f[x][0]=fa;
	dep[x]=dep[fa]+1;
	int w=getw(x,fa);
	if(fa==0) ans[x][0]=0x3f3f3f3f;
	else ans[x][0]=w;
	for(int i=1;i<=lg[dep[x]]-1;i++){
		ans[x][i]=min(ans[x][i-1],ans[f[x][i-1]][i-1]);
		f[x][i]=f[f[x][i-1]][i-1];	
	}
	for(int i=0;i<ad[x].size();i++){
		if(ad[x][i].v!=fa) dfs(ad[x][i].v,x);
	}
}
int lca(int a,int b){
	int ansn=0;
	if(find(a)!=find(b)) return -1;
	if(dep[a]>dep[b]) swap(a,b);
	while(dep[a]<dep[b]){
		ansn=min(ansn,ans[b][lg[dep[b]-dep[a]]-1]);
		b=f[b][lg[dep[b]-dep[a]]-1];
	}
	if(a==b) return a;
	for(int i=lg[dep[a]]-1;i>=0;i--){
		if(f[a][i]==f[b][i]) continue;
		else{
			ansn=min(ansn,min(ans[a][i],ans[b][i]));
			a=f[a][i],b=f[b][i];
		}
	}
	ansn=min(ansn,min(ans[a][0],ans[b][0]));
	return ansn;
}
void krus(){
	int cnt=n-1;
	for(int i=1;i<=m;i++){
		if(cnt==0) break;
		if(find(e[i].u)==find(e[i].v)) continue;
		else{
			cnt--;
			fa[find(e[i].u)]=find(e[i].v);
			ad[e[i].u].push_back((node){e[i].u,e[i].v,e[i].w});//
			ad[e[i].v].push_back((node){e[i].u,e[i].v,e[i].w});//
//			int u=e[i].u,v=e[i].v,w=e[i].w;
//			ad[u].push_back(node(u,v,w));
//        	ad[v].push_back(node(v,u,w));
		}
	}
}
int main(){
	cin>>n>>m;
	s=1;
	for(int i=1;i<=m;i++){
		cin>>a>>b>>c;
		add(a,b,c);
	}
	for(int i=1;i<=n;i++) fa[i]=i;
	stable_sort(e+1,e+m+1,cmp);
	krus();
	for(int i=1;i<=n;i++) lg[i]=lg[i-1]+((1<<lg[i-1])==i); 
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			dfs(i,0);
		}
	}
	cin>>k;
	for(int i=1;i<=k;i++){
		cin>>a>>b;
		cout<<lca(a,b)<<endl;
	}
	return 0;
}
2025/2/5 20:12
加载中...