Kruskal+LCA 的可能更简便的做法
查看原帖
Kruskal+LCA 的可能更简便的做法
1161172
HaneDaniko楼主2024/10/22 19:18

为啥题解清一色全是求次大值再做题的

要找的是路径上小于当前边权的最大边权

那为啥不直接在 LCA 里判掉

int lca(int x,int y,int less){
	if(deep[x]<deep[y]) swap(x,y);
	int res=-1;
	for(int i=16;i>=0;--i){
		if(deep[fa[i][x]]>=deep[y]){
			if(w[i][x]<less) res=max(res,w[i][x]);
			x=fa[i][x];
		}
	}
	if(x==y) return res;
	for(int i=16;i>=0;--i){
		if(fa[i][x]!=fa[i][y]){
			if(w[i][x]<less) res=max({res,w[i][x]});
			if(w[i][y]<less) res=max({res,w[i][y]});
			x=fa[i][x];
			y=fa[i][y];
		}
	}
	if(w[0][x]<less) res=max({res,w[0][x]});
	if(w[0][y]<less) res=max({res,w[0][y]});
	return res;
}
2024/10/22 19:18
加载中...