求助,5pts,第三个样例自测能过但Wa了
查看原帖
求助,5pts,第三个样例自测能过但Wa了
421719
zxyu112楼主2024/12/12 17:05
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
const int inf=1e5+10;
vector <pair<int,int> > e[N];
int n,m,q;
int f[N];
int fa[20][N],dis[N];
int w[20][N];
bool vis[N];
struct node{
	int u,v,t;
}ad[N];
bool cmp(node x,node y){
	return x.t>y.t;
}
void init(){
	for(int i=1;i<=n;i++){
		f[i]=i;
	}
}
int find(int x){
	if(x==f[x])return x;
	return f[x]=find(f[x]);
}
void merge(int a,int b){
	int u=find(a),v=find(b);
	if(u==v)return;
	f[u]=v; 
}//最大生成树 
// 
void dfs(int x,int father,int d){
	vis[x]=1;
	fa[0][x]=father;
	dis[x]=d;
	for(int i=0;i<e[x].size();i++){
		if(!vis[e[x][i].first]){
			w[0][e[x][i].first]=e[x][i].second;
			dfs(e[x][i].first,x,d+1);
		}
	}
	return;
}
void lca_init(){
	for(int k=1;k<=20;k++){
		for(int i=1;i<=n;i++){
			fa[k][i]=fa[k-1][fa[k-1][i]];
			w[k][i]=min(w[k-1][fa[k-1][i]],w[k-1][i]);
		}
	}
}
int query(int a,int b){
	if(find(a)!=find(b))return -1;
	int ans=inf;
	if(a!=b){
		if(dis[a]<dis[b])swap(a,b);
		int k=dis[a]-dis[b];
		for(int i=20;i>=0;i--){
			if(dis[fa[i][a]]>=dis[a]){
				a=fa[i][a];
				ans=min(ans,w[i][a]);
			}
		}
	}
	if(a==b)return ans;	
	for(int i=20;i>=0;i--){
		if(fa[i][a]!=fa[i][b]){
			ans=min(ans,min(w[i][a],w[i][b]));
			a=fa[i][a];
			b=fa[i][b];
		}
	}
	ans=min(ans,min(w[0][a],w[0][b]));	
	return ans;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	init();
	for(int i=1;i<=m;i++){
		cin>>ad[i].u>>ad[i].v>>ad[i].t;
	}
	sort(ad+1,ad+1+m,cmp);
	for(int i=1;i<=m;i++){
		int x=ad[i].u,y=ad[i].v,z=ad[i].t;
		if(find(x)!=find(y)){
			merge(x,y);
			e[x].push_back(make_pair(y,z));
			e[y].push_back(make_pair(x,z));
		}
	}
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			dfs(i,i,1);
			w[0][i]=inf;
		}
	}
	lca_init();
	cin>>q;
	while(q--){
		int x,y;
		cin>>x>>y;
		cout<<query(x,y)<<"\n";
	} 
	return 0;
}
2024/12/12 17:05
加载中...