社区讨论

关于从大到小排序的问题

P9235[蓝桥杯 2023 省 A] 网络稳定性参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m32vmhbc
此快照首次捕获于
2024/11/04 18:26
去年
此快照最后确认于
2025/11/04 15:22
4 个月前
查看原帖
cmp函数里为什么要严格大于,大于等于就会WA第二三个点
CPP
#include<bits/stdc++.h>
#define N 600000
using namespace std;
long long n,m,tot;
long long head[N],to[N],nxt[N],val[N];
long long deep[N],st[N][50],stmin[N][50];
long long vis[N];
long long power;
void add(long long x,long long y,long long z){
	to[++tot]=y;
	nxt[tot]=head[x];
	val[tot]=z;
	head[x]=tot;
}
long long min(long long x,long long y){
	return x>y?y:x;
}
struct data{
	long long x,y,v;
}gra[550001];
bool cmp(data a,data b){
	return a.v>b.v;
}
long long fa[N];
long long find(long long i){
	if(i!=fa[i]) fa[i]=find(fa[i]);
	return fa[i];
}
void Kruskal(){
	sort(gra+1,gra+1+m,cmp);
	for(long long i=1;i<=n;i++) fa[i]=i;
	for(long long i=1;i<=m;i++){
		long long x=gra[i].x;
		long long y=gra[i].y;
		long long z=gra[i].v;
		if(find(x)!=find(y)){
			add(x,y,z);
			add(y,x,z);
			fa[find(x)]=find(y);
		}
	}
}
void dfs(long long x,long long fa){
	deep[x]=deep[fa]+1;
	st[x][0]=fa;
	vis[x]=1;
	for(long long p=1;(1<<p)<=deep[x];p++){
		st[x][p]=st[st[x][p-1]][p-1];
		stmin[x][p]=min(stmin[st[x][p-1]][p-1],stmin[x][p-1]);
	}
	for(long long i=head[x];i;i=nxt[i]){
		long long v=to[i];
		if(!vis[v]){
			stmin[v][0]=val[i];
			dfs(v,x);
		}
	}
}
long long log_2(long long x){
	long long ans=0;
	while((1<<ans)<=(x>>1))
		ans++;
	return ans;
}
long long lca(long long a,long long b){
	if(find(a)!=find(b)) return -1;
	if(deep[a]<deep[b]) swap(a,b);
	long long ans=2e9;
	for(long long p=power;p>=0;p--){
		if(deep[st[a][p]]>=deep[b]){
			ans=min(ans,stmin[a][p]);
			a=st[a][p];
		} 
	}
	if(a==b) return ans;
	for(long long p=power;p>=0;p--){
		if(st[a][p]!=st[b][p]){
			ans=min(ans,min(stmin[a][p],stmin[b][p]));
			a=st[a][p];
			b=st[b][p];
		}
	}
	ans=min(ans,min(stmin[a][0],stmin[b][0]));
	return ans;
}
int main() {
	long long q;
	cin>>n>>m>>q;
	power=log_2(n);
	for(long long i=1;i<=m;i++)
		scanf("%lld%lld%lld",&gra[i].x,&gra[i].y,&gra[i].v);
	Kruskal();
	for(long long i=1;i<=n;i++)
		if(!vis[i])
			dfs(i,0);
	for(long long i=1;i<=q;i++){
		long long x,y;
		scanf("%lld%lld",&x,&y);
		printf("%lld\n",lca(x,y));
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...