求调(MLE on test 6)
查看原帖
求调(MLE on test 6)
768476
gf202276楼主2024/11/10 22:31
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct poi{
	int fth,x,w;
	bool operator<(const poi & t)const{
		if(t.w==w)return x<t.x;
		else return w<t.w;
	}
};
const int NN=5e6+100;
struct pp{
	int to,nxt,w;
}en[NN<<2];
int tot,head[NN];
void add(int x,int y,int z){
	en[++tot]=(pp){y,head[x],z};
	head[x]=tot;
}
int bl[NN],cnt;
map<int,int>mp[NN],in[NN];
map<int,int>e[NN];
set<poi>N,Z,S,SS;
void dfs(int u){
	bl[u]=cnt;
	for(int i=head[u];i;i=en[i].nxt){
		int v=en[i].to;
		if(e[u][v]==0)break;
		if(!bl[v])dfs(v);
	}
}
int n,m,tp,ans,fl;
main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		e[x][y]=e[y][x]=z;
		tp^=z;
	}
	cnt=n-1;
	for(int i=2;i<=n;i++){
		if(e[i][1])N.insert((poi){1,i,e[i][1]});
		else Z.insert((poi){1,i,0}); 
	} 
	while(cnt--){
		int x=0,fth=0;
		S.clear();SS.clear();
		if(Z.size()){
			poi p=(*Z.begin());
			x=p.x;Z.erase(Z.begin());
			fth=p.fth;
		}
		else {
			poi p=(*N.begin());
			x=p.x,ans+=p.w;
			N.erase(N.begin());
			fth=p.fth;
		}
		add(x,fth,e[x][fth]);add(fth,x,e[x][fth]);in[fth][x]=in[x][fth]=1; 
		for(auto it=N.begin();it!=N.end();it++){
			int v=(*it).x;
			if(e[v][x]==0){
				S.insert(*it);
			}else{
				SS.insert(*it);
			}
		}
		for(auto it=S.begin();it!=S.end();it++){
			Z.insert((poi){x,(*it).x,0});
			N.erase(*it);
		} 
		for(auto it=SS.begin();it!=SS.end();it++){
			poi p=(*it);
			N.erase(p);
			if(p.w>e[x][p.x])p.fth=x,p.w=e[x][p.x];
			N.insert(p);
		}
	}
	int D=n*(n-1)/2-m;
	if(D>n-1)fl=0;
	else{
		for(int i=1;i<=n;i++){
			for(int j=i+1;j<=n;j++){
				if(e[i][j]==0){
					if(in[i][j]==0)fl=0;
					else fl=1;
				}
			}
		}
	}
	if(fl==0){
		cout<<ans<<"\n";	
		return 0;
	}
	for(int i=1;i<=n;i++){
		if(!bl[i]){
			++cnt;
			dfs(i);
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			if(e[i][j]!=0&&in[i][j]==0){
				if(bl[i]!=bl[j])tp=min(tp,e[i][j]);
			}
		}
	}
	cout<<ans+tp;
}

2024/11/10 22:31
加载中...