悬2关 LCA+最大生成树 10pts求调
查看原帖
悬2关 LCA+最大生成树 10pts求调
373198
WhileTrueRP楼主2023/11/15 10:43

AC on #1#2#3 评测记录

#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+5;
vector<pair<int,int> > e[N];
int n,m;
int f[N],d[N],arc[20][N],st[20][N];
bool vis[N];
priority_queue<pair<int,pair<int,int> > > q;
int findn(int t){
	return f[t] == t?t:f[t] = findn(f[t]);
}
void add(int u,int v,int w){
	e[u].push_back(make_pair(v,w));
	e[v].push_back(make_pair(u,w));
}
void kru(){
	for(int i=1;i<=n;i++){
		f[i] = i;
	}
	int cnt = 1;
	while(cnt < n && !q.empty()){
		int x = q.top().second.first;
		int y = q.top().second.second;
		int w = q.top().first;
		
		int xx = findn(x);
		int yy = findn(y);
		
		q.pop();
		if(xx != yy){
			f[xx] = yy;
			cnt ++;
			add(x,y,w);
//			printf("%d %d %d\n",x,y,w);
		}
	}
}
void dfs(int now,int fa){
	d[now] = d[fa] + 1;
	arc[0][now] = fa;
	for(int i=0;i<e[now].size();i++){
		int v = e[now][i].first;
		if(v == fa){
			continue;
		}
		st[0][v] = e[now][i].second;
		dfs(v,now);
	} 
}
int query(int x,int y){
	int ans = 0x3f3f3f3f;
	if(d[x] < d[y]){
		swap(x,y);
	}//保证d[x] >= d[y];
	for(int i=18;i>=0;i--){
		if(d[arc[i][x]] >= d[y]){
			ans = min(ans,st[i][x]);
			x = arc[i][x];	
		}
	}
	if(x == y){
		return ans;
	}
	for(int i=18;i>=1;i--){
		if(arc[i][x] != arc[i][y]){
			ans = min(ans,st[i][x]);
			ans = min(ans,st[i][y]);
			x = arc[i][x];
			y = arc[i][y];
		}
	}
	ans = min(ans,st[0][x]);
	ans = min(ans,st[0][y]);
	return ans;
	return arc[0][x];
}
void init(){
	for(int i=1;i<=18;i++){
		for(int j=1;j<=n;j++){
			arc[i][j] = arc[i-1][arc[i-1][j]];
			st[i][j] = min(st[i-1][j],st[i-1][arc[i-1][j]]);
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		q.push(make_pair(w,make_pair(v,u)));
	}
	int que;
	scanf("%d",&que);
	kru();
	for(int i=1;i<=n;i++){
		int xx = findn(i);
		if(vis[xx] == false){
			dfs(i,0);
			vis[xx] = true;
		}
	}
	
	init();
	for(int i=1;i<=que;i++){
		int x,y,lca;
		scanf("%d%d",&x,&y);
		if(findn(x) != findn(y)){
			puts("-1");
		}else{
			printf("%d\n",query(x,y));
		}
	}
}
2023/11/15 10:43
加载中...