Hack 数据过不了,玄关求调
查看原帖
Hack 数据过不了,玄关求调
929151
xxr___楼主2024/7/25 10:11
#include<iostream>
#include<algorithm>
#include<vector>
#define ll long long
#define up(i,l,r) for(int i=l;i<=r;++i)
#define dn(i,l,r) for(int i=r;i>=l;--i)
#define pb push_back
#define inf (int)1e9
const int N=5e4+5;
int n,m,s,t,f[N][22],fa[N][22],q,father[N],dep[N],cnt=0;
using namespace std; 
struct node{
	int u,v,w;
}e[N];
bool operator<(const node&x,const node&y){
	return x.w>y.w;
}
vector<pair<int,int> > g[N];
inline int fd(int u){
	if(u==father[u]) return u;
	return father[u]=fd(father[u]);
}
inline void merge(int u,int v){
	father[fd(u)]=fd(v);
}
inline void dfs(int u,int fat){
	dep[u]=dep[fat]+1;
	for(pair<int,int> p:g[u]){
		int v=p.first,w=p.second;
		if(v==fat) continue;
		dep[v]=dep[u]+1;f[v][0]=w;
		fa[v][0]=u;
		dfs(v,u);
	}
}
inline int lca(int u,int v){
	if(dep[u]<dep[v]) swap(u,v);
	for(int j=19;j>=0;--j){
		if(dep[u]-(1<<j)>=dep[v]){
			u=fa[u][j];
		}
	}
	if(u==v) return u;
	for(int j=19;j>=0;--j){
		if(fa[u][j]!=fa[v][j]){
			u=fa[u][j];v=fa[v][j];
		}
	}
	return fa[u][0];
}
inline int Min(int u,int v){
	if(dep[u]<dep[v]) swap(u,v);
	int mn=1e9;
	for(int j=19;j>=0;--j){
		if(dep[u]-(1<<j)>=dep[v]){
			mn=min(mn,f[u][j]);
			u=fa[u][j];
		}
	}
	if(u==v) return mn;
	for(int j=19;j>=0;--j){
		if(fa[u][j]!=fa[v][j]){
			mn=min(mn,std::min(f[u][j],f[v][j]));
			u=fa[u][j];v=fa[v][j];
		}
	}
	return min({mn,f[u][0],f[v][0]});
}
inline int query(int u,int v){
	int l=lca(u,v);
	if(!l){
		return -1;
	}
	return Min(u,v);
}
int main(){
	
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin>>n>>m;
	up(i,1,m){
		cin>>e[i].u>>e[i].v>>e[i].w;
	}
	
	sort(e+1,e+m+1);
	up(i,1,n){
		father[i]=i;
	}
	up(i,1,n){
		up(j,0,19){
			f[i][j]=inf;
		}
	}
	up(i,1,m){
		int x=fd(e[i].u),y=fd(e[i].v);
		if(x!=y){
			merge(x,y);
			g[e[i].u].pb({e[i].v,e[i].w});
			g[e[i].v].pb({e[i].u,e[i].w});
			++cnt;
			if(cnt==n-1){
				break;
			}
		}
	}
	dfs(1,0);
	up(j,1,19){
		up(i,1,n){
			fa[i][j]=fa[fa[i][j-1]][j-1];
			f[i][j]=min(f[i][j-1],f[fa[i][j-1]][j-1]);
			// printf("f[%d][%d]=%d\n",i,j,f[i][j]);
		}
	}
	cin>>q;
	up(i,1,q){
		cin>>s>>t;
		if(fd(s)!=fd(t)){
		    cout<<"-1\n";
		}else
		    cout<<query(s,t)<<'\n';
	}
	cout.flush();
// 	system("pause");
  
  
	return 0;
}
2024/7/25 10:11
加载中...