10分LCA求助
查看原帖
10分LCA求助
688783
SilverLi楼主2023/4/9 21:55

10 pts+WA⁡\operatorname{10\ pts+WA}

#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
const int N=5e4+5,lg=21;
int n,m,q;
int f[N];
int fa[N][lg],w[N][lg],d[N];
bool vis[N];
struct nd {int u,v,w;}k[N];
vector<pair<int,int> >g[N];
int find(int v) {return (f[v]==v?v:f[v]=find(f[v]));}
inline int min(int a,int b,int c) {return (a<b?a:(b<c?b:c));}
void dfs(int v,int ft,int val) {
	d[v]=d[ft]+1,fa[v][0]=ft,w[v][0]=val;
	vis[v]=1;
	for(auto i:g[v])
		if(!vis[i.x])	dfs(i.x,v,i.y);
}
signed main() {
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;++i)	f[i]=i;
	for(int i=1;i<=m;++i)	cin>>k[i].u>>k[i].v>>k[i].w;
	sort(k+1,k+m+1,[](nd a,nd b){return a.w>b.w;});
	for(int i=1;i<=m;++i)
		if(find(k[i].u)!=find(k[i].v))
			f[find(k[i].u)]=find(k[i].v),
			g[k[i].u].push_back(make_pair(k[i].v,k[i].w)),
			g[k[i].v].push_back(make_pair(k[i].u,k[i].w));
	for(int i=1;i<=n;++i)
		if(!vis[i])	dfs(i,0,1e9);
	for(int j=1;j<lg;++j)
		for(int i=1;i<=n;++i)
			fa[i][j]=fa[fa[i][j-1]][j-1],
			w[i][j]=min(w[i][j-1],w[fa[i][j-1]][j-1]);
	cin>>q;
	while(q--) {
		int u,v;
		cin>>u>>v;
		if(find(u)!=find(v)) {puts("-1");continue;}
		int ans=1e9;
		if(d[u]<d[v])	swap(u,v);
		for(int i=lg-1;i>=0;--i)
			if(d[fa[u][i]]>d[v])
				ans=min(ans,w[u][i]),
				u=fa[u][i];
		for(int i=lg-1;i>=0;--i)
			if(fa[u][i]!=fa[v][i])
				ans=min(ans,w[u][i],w[v][i]),
				u=fa[u][i],v=fa[v][i];
		ans=min(ans,w[u][0],w[v][0]);
		cout<<ans<<endl;
	}
	return 0;
}
2023/4/9 21:55
加载中...