0分求条样例过了
查看原帖
0分求条样例过了
734556
KEMIIIIIII楼主2025/7/19 14:37

rt

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=4e4+5,inf=0x3f3f3f3f;
struct bian{
	int u,v,w;
	bool operator < (const bian &o)const{return w>o.w;}
}bian[N<<1];
int n,m,fa[N];
inline int find(int x){
	return x==fa[x]?x:fa[x]=find(fa[x]);
}
struct Edge{
	int to,w,next;
}edge[N<<1];int cnt(0),head[N];
inline void add(int x,int y,int w){
	edge[++cnt]=Edge{y,w,head[x]};
	head[x]=cnt;
}
void Kruskal(){
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++){
		int u=bian[i].u,v=bian[i].v,w=bian[i].w;
		if(find(u)!=find(v)){
			fa[find(u)]=fa[find(v)];
			add(u,v,w);
			add(v,u,w);
		}
	}
}
bool vis[N];
int f[N][20],w[N][20],dep[N];
void dfs(int u){
	vis[u]=1;
	for(int i=head[u];i;i=edge[i].next){
		int v=edge[i].to,W=edge[i].w;
		if(vis[v]) continue;
		dep[v]=dep[u]+1;
		f[v][0]=u;
		w[v][0]=W;
		dfs(v);
	}
}
inline int getans(int x,int y){
	if(find(x)!=find(y)) return -1;
	int ans(inf);
	if(dep[x]>dep[y]) swap(x,y);
	for(int i=20;i>=0;i--){
		if(dep[f[y][i]]>=dep[x]){
			ans=min(ans,w[y][i]);
			y=f[y][i];
		}
	}
	if(x==y) return ans;
	for(int i=20;i>=0;i--){
		if(f[x][i]!=f[y][i]){
			ans=min(ans,w[x][i]);
			ans=min(ans,w[y][i]);
			x=f[x][i];
			y=f[y][i];
		}
	}
	ans=min(ans,w[x][0]);
	ans=min(ans,w[y][0]);
	return ans;
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>bian[i].u>>bian[i].v>>bian[i].w;
	}
	sort(bian+1,bian+1+m);
	Kruskal();
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			dep[i]=1;
			dfs(i);
			f[i][0]=i;
			w[i][0]=inf;
		}
	}
	for(int j=1;j<=20;j++){
		for(int i=1;i<=n;i++){
			f[i][j]=f[f[i][j-1]][j-1];
			w[i][j]=min(w[i][j-1],w[f[i][j-1]][j-1]);
		}
	}
	int Q;
	cin>>Q;
	for(int i=1;i<=Q;i++){
		int x,y;
		cin>>x>>y;
		cout<<getans(x,y)<<"\n";
	}
	return 0;
}
2025/7/19 14:37
加载中...