玄关求条
查看原帖
玄关求条
683212
Henly_Z楼主2024/7/30 11:49

样例过了,全WA了

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 200005;
int fa[maxn][25],n,q,maxnum[maxn][25],m;
struct Node{
	int x , y;
};
Node kth(int u , int k){
	int val = 1000000;
	for(int i = 20 ; i >= 0 ; i--) if(k & (1 << i)){
		val = min(val,maxnum[u][i]);
		u = fa[u][i];
	}
	Node ccd;
	ccd.x = u;
	ccd.y = val;
	return ccd;
}
int dep[maxn];
int lca(int u , int v){
	int cndfd = 1000005;
	if(dep[u] < dep[v]) swap(u,v);
	Node cfd = kth(u,dep[u] - dep[v]);
	u = cfd.x;
	cndfd = min(cndfd,cfd.y);
	if(u == v) return cndfd;
	for(int i = 20 ; i >= 0 ; i--){
		if(fa[u][i] != fa[v][i]){
			cndfd = min(maxnum[u][i],min(cndfd,maxnum[v][i])); 
			u = fa[u][i];
			v = fa[v][i];
		}
	}
	cndfd = min(cndfd , maxnum[u][0]);
	cndfd = min(cndfd,maxnum[v][0]);
	return cndfd;
}
vector<Node> g[maxn];
void dfs(Node u , int f){
//	cout << u.x << " " << f << endl;
	if(dep[u.x ] != 0) return ;
	dep[u.x] = dep[f] + 1;
	fa[u.x][0] = f;
	maxnum[u.x][0] = u.y;
	for(int i = 1 ; i <= 20 ; i++){
		fa[u.x][i] = fa[fa[u.x][i - 1]][i - 1];
		maxnum[u.x][i] = min(maxnum[u.x][i - 1],maxnum[fa[u.x][i - 1]][i - 1]);
	} 
	for(auto v:g[u.x]){
		if(v.x != f){
			dfs(v,u.x);
		}
	}
}
signed main(){
	cin >> n >> m;	
	for(int i = 1 ; i <= m ; i++){
		int u , v , x;
		scanf("%lld %lld %lld" , &u , &v , &x);
		Node ccd;
		ccd.x = v;
		ccd.y = x;
		g[u].push_back(ccd);
		ccd.x = u;
		g[v].push_back(ccd);
	}
	Node sd;
	sd.x = 1;
	sd.y = 0; 
	dfs(sd,0);
	cin >> q;
	int last = 0;
	while(q--){
		int u , v;
		scanf("%lld %lld" , &u , &v);
		int x = lca(u,v);
		if(x == 0) x = -1;
		cout << x << endl;
	}
} 
2024/7/30 11:49
加载中...