社区讨论

solve 函数只会输出9223372036854775807求调

P4180[BJWC2010] 严格次小生成树参与者 2已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mijqp6zk
此快照首次捕获于
2025/11/29 11:36
3 个月前
此快照最后确认于
2025/11/29 21:10
3 个月前
查看原帖
可能出问题的 solve 函数
CPP
void solve(){
	long long ess=LLONG_MAX;
	for(long long i=1;i<=m;i++){
		if(kt[i].fr==kt[i].to||vis[i]) continue;
		if(mp[{kt[i].fr,{kt[i].to,kt[i].p}}]==1) continue;
		long long lcaa=lca::getlca(kt[i].fr,kt[i].to);
		long long mx=gtt(kt[i].fr,lcaa,kt[i].p);
		long long my=gtt(kt[i].to,lcaa,kt[i].p);
		ess=min(ess,ess-max(mx,my)+kt[i].p);
	}
	cout<<ess;
}
所有代码:
CPP
#include <bits/stdc++.h>
using namespace std;
long long n,m;
const long long N=1e5+7;
const long long M=3e5+7;
struct Edge{
	long long fr,to,p;
	bool operator <(const Edge&ot)const{
		return p<ot.p;
	}
};
struct edge{
	long long to,p;
};
long long fat[N];
Edge kt[M];
vector<edge> T[N];
map<pair<long long,pair<long long ,long long> >,bool> mp;
bool vis[M];
namespace bcj{
	long long find(long long x){
		if(fat[x]==x) return x;
		return fat[x]=bcj::find(fat[x]);
	}
	void init(long long n){
		for(long long i=1;i<=n;i++){
			fat[i]=i;
		}
	}
	void mg(long long x,long long y){
		fat[bcj::find(x)]=bcj::find(y);
	}
} 
void ldd(long long x,long long y,long long p){//邻接表 
	T[x].push_back({y,p});
}
long long ans=0;
void ksk(){
	//克鲁斯克
	long long tot=0;
	sort(kt+1,kt+1+m);
	
	for(long long i=1;i<=m;i++){
		long long fx=kt[i].fr,fy=kt[i].to;
		if(bcj::find(fx)!=bcj::find(fy)){
			bcj::mg(fx,fy);
			ans+=kt[i].p;
			ldd(fx,fy,kt[i].p);
			ldd(fy,fx,kt[i].p);//无向建图 
			++tot;
		}
		mp[{kt[i].fr,{kt[i].to,kt[i].p}}]=1;
		if(tot==n-1) break;//构成树后跑路 
	} 
	
}
long long fa[N][25],wf[N][25],Ws[N][25];//倍增‘
long long ep[N];
namespace lca{
	void dfs(long long now,long long lst){
		ep[now]=ep[lst]+1;
		fa[now][0]=lst;
		//2^0个祖先是lst(last
		for(long long i=1;i<=20;i++){
			fa[now][i]=fa[fa[now][i-1]][i-1];
			wf[now][i]=max(wf[now][i-1],wf[fa[now][i-1]][i-1]);
			Ws[now][i]=max(Ws[now][i-1],Ws[fa[now][i-1]][i-1]);//Beizeng
			if(wf[now][i-1]!=wf[fa[now][i-1]][i-1]){
				Ws[now][i]=max(Ws[now][i],min(wf[now][i-1],wf[fa[now][i-1]][i-1]));
			}
		}		 
		long long L=T[now].size();
		for(long long i=0;i<L;i++){
			long long e=T[now][i].to;
			if(e!=lst){
				wf[e][0]=T[now][i].p;
				lca::dfs(e,now);
			}
		}
	}
	long long getlca(long long x,long long y){
		if(ep[x]<ep[y]){
			swap(x,y);
		}
		for(long long i=20;i>=0;i--){
			if(ep[x]-(1ll<<i)>=ep[y]){
				x=fa[x][i];
				
			}
		}
		if(x==y) return x;
		for(long long i=20;i>=0;i--){
			if(fa[x][i]!=fa[y][i]){
				x=fa[x][i];
				y=fa[y][i];
			}
		}
		return fa[x][0];
	}
}
long long gtt(long long x,long long y,long long w){
	long long nns=LLONG_MIN;
	for(long long i=20;i>=0;i--){
		if(ep[fa[x][i]]>=ep[y]){
			if(w!=wf[x][i]) nns=max(w,wf[x][i]);
			else nns=max(nns,Ws[x][i]);
			x=fa[x][i];
		}
	}
	return nns;
}
void solve(){
	long long ess=LLONG_MAX;
	for(long long i=1;i<=m;i++){
		if(kt[i].fr==kt[i].to||vis[i]) continue;
		if(mp[{kt[i].fr,{kt[i].to,kt[i].p}}]==1) continue;
		long long lcaa=lca::getlca(kt[i].fr,kt[i].to);
		long long mx=gtt(kt[i].fr,lcaa,kt[i].p);
		long long my=gtt(kt[i].to,lcaa,kt[i].p);
		ess=min(ess,ess-max(mx,my)+kt[i].p);
	}
	cout<<ess;
}
signed main(){
	cin.tie(0)->sync_with_stdio(0);
	cin>>n>>m;
	for(long long i=1;i<=m;i++){
		cin>>kt[i].fr>>kt[i].to>>kt[i].p;
	}
	//read
	ksk();
	lca::dfs(1,0);
	solve();
	return 0;
}

回复

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

正在加载回复...