样例没过 求调
查看原帖
样例没过 求调
831011
Deltary_楼主2024/10/24 22:12

很突兀,但是机房已经要关门了所以放在这里

没有注释十分抱歉

觉得自己可能是哪里脑抽了但是我看不出来

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9') x=10*x+c-'0',c=getchar();
	return x*f;
}
int n,m,q;
const int N=1e5+10;
const int M=3e5+10;
const int inf=1e9;
namespace ns{
	int fa[N];
	void init(){
		for(int i=1;i<=n;i++) fa[i]=i;
	}
	int find(int x){
		if(x==fa[x]) return x;
		fa[x]=find(fa[x]);
		return fa[x]; 
	}
	void merge(int a,int b){
		a=find(a),b=find(b);
		fa[a]=b;
	}
}
typedef pair<int,pair<int,int> > pii;
bool cmp(pii a,pii b){return a.first>b.first;}
vector <pii> V;
vector <pair<int,int> > G[N];
namespace lca{
	int st[N][20],ans[N][20],fa[N],dis[N];
	void dfs(int u,int f,int val){
		fa[u]=f,dis[u]=val;
		st[u][0]=f;
		for(int i=1;i<=19;i++){
			st[u][i]=st[st[u][i-1]][i-1]; 
			ans[u][i]=min(ans[st[u][i-1]][i-1],ans[u][i-1]);
		}
		
		for(auto k:G[u]){
			int v=k.first,w=k.second;
			if(v==f) continue;
			ans[v][0]=w;
		 	dfs(v,u,val+1);
		}
	}
	int lca(int x,int y){
		int res=inf;
		if(dis[x]>dis[y]) swap(x,y);//Notice: Make sure x is higher than y
		for(int k=19;k>=0;k--) if(dis[st[y][k]]>=dis[x]) res=min(res,ans[y][k]),y=st[y][k];
		if(x==y) return res;
		for(int k=19;k>=0;k--){
			if(st[x][k]!=st[y][k]) res=min(res,min(ans[x][k],ans[y][k])),x=st[x][k],y=st[y][k];
		} 
		return min(res,min(ans[x][0],ans[y][0]));
	}
}
int main(){
	n=read(),m=read(),q=read();
	ns::init();
	for(int i=1;i<=m;i++){
		int u=read(),v=read(),w=read();
		V.push_back({w,{u,v}});
	}
	sort(V.begin(),V.end(),cmp);
	for(auto k:V){
		int w=k.first,u=k.second.first,v=k.second.second;
		if(ns::find(u)!=ns::find(v)){
			ns::merge(u,v);
			G[u].push_back({v,w});
			G[v].push_back({u,w});
		}
	}
	lca::dfs(1,0,0);
	while(q--){
		int u=read(),v=read();
		if(ns::find(u)!=ns::find(v)){
			cout<<"-1"<<endl;
		}else{
			cout<<lca::lca(u,v)<<endl;
		}
	}
	
	return 0;
}
2024/10/24 22:12
加载中...