关于WA on #6
查看原帖
关于WA on #6
241838
microchip楼主2024/4/5 17:38

各位A了的大佬们,6#错了的都是些什么原因啊,那些hack我的代码跑都是对的

#include<bits/stdc++.h>
using namespace std;

struct node{
	long long to,val;
}N;

struct edge{
	long long from,to,val;
}ed[300050];

bool cmp(edge A,edge B){
	return A.val<B.val;
}

long long n,m,x,y,z,f[100050],k,depth[100050],bz_max[100050][20],bz_min[100050][20],bz[100050][20];
long long ans=2147483647000000000,sum;
bool mst[300050];
vector<node> T[100050],new_T[100050];

long long find(long long x){
	if(f[x]==x)return x;
	return f[x]=find(f[x]);
}

void merge(long long x,long long y){
	f[find(x)]=find(y);
}

long long min(long long X,long long Y){
	return X<Y?X:Y;
}

long long find_max(long long X,long long Y){
	if(depth[X]<depth[Y])swap(X,Y);
	long long ret=-2147483647,tmp;
	while(depth[X]>depth[Y]){
		tmp=log2(depth[X]-depth[Y]);
		ret=max(ret,bz_max[X][tmp]);
		X=bz[X][tmp];
	}if(X==Y)return ret;
	tmp=log2(depth[X]-1);
	while(tmp>0){
		if(bz[X][tmp]==bz[Y][tmp])tmp--;
		else{
			ret=max(ret,bz_max[X][tmp]);
			ret=max(ret,bz_max[Y][tmp]);
			X=bz[X][tmp];
			Y=bz[Y][tmp];
		}
	}ret=max(ret,bz_max[X][0]);
	ret=max(ret,bz_max[Y][0]);
	return ret;
}

long long find_min(long long X,long long Y){
	if(depth[X]<depth[Y])swap(X,Y);
	long long ret=-2147483647,tmp,maxn=find_max(X,Y);
	while(depth[X]>depth[Y]){
		tmp=log2(depth[X]-depth[Y]);
		if(bz_max[X][tmp]<maxn)ret=max(ret,bz_max[X][tmp]);
		else ret=max(ret,bz_min[X][tmp]);
		X=bz[X][tmp];
	}if(X==Y)return ret;
	tmp=log2(depth[X]-1);
	while(tmp>0){
		if(bz[X][tmp]==bz[Y][tmp])tmp--;
		else{
			if(bz_max[X][tmp]<maxn)ret=max(ret,bz_max[X][tmp]);
			else ret=max(ret,bz_min[X][tmp]);
			if(bz_max[Y][tmp]<maxn)ret=max(ret,bz_max[Y][tmp]);
			else ret=max(ret,bz_min[X][tmp]);
			X=bz[X][tmp];
			Y=bz[Y][tmp];
		}
	}if(bz_max[X][0]<maxn)ret=max(ret,bz_max[X][0]);
	else ret=max(ret,bz_min[X][0]);
	if(bz_max[Y][0]<maxn)ret=max(ret,bz_max[Y][0]);
	else ret=max(ret,bz_min[Y][0]);
	return ret;
}

void dfs(long long no,long long deep){
	depth[no]=deep;
	for(unsigned int i=0;i<new_T[no].size();i++){
		if(depth[new_T[no][i].to]==0){
			bz_max[new_T[no][i].to][0]=new_T[no][i].val;
			bz[new_T[no][i].to][0]=no;
			dfs(new_T[no][i].to,deep+1);
		}
	}
}

int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)f[i]=i;
	for(int i=1;i<=m;i++){
		cin>>x>>y>>z;
		if(x==y)continue;
		N.to=y;N.val=z;
		T[x].push_back(N);
		N.to=x;
		T[y].push_back(N);
		k++;
		ed[k].from=x;ed[k].to=y;ed[k].val=z;
	}sort(ed+1,ed+k+1,cmp);
	int tmp=k;k=1;
	for(int i=1;i<n;i++){
		while(find(ed[k].to)==find(ed[k].from))k++;
		merge(ed[k].to,ed[k].from);
		mst[k]=1;
		N.to=ed[k].to;N.val=ed[k].val;
		new_T[ed[k].from].push_back(N);
		N.to=ed[k].from;
		new_T[ed[k].to].push_back(N);
		sum+=ed[k].val;
	}
	memset(bz_max,-0x7f,sizeof(bz_max));
	memset(bz_min,-0x7f,sizeof(bz_min));
	dfs(1,1);
	for(int j=1;j<20;j++)
		for(int i=1;i<=n;i++)
			bz[i][j]=bz[bz[i][j-1]][j-1];
	for(int j=1;j<20;j++)
		for(int i=1;i<=n;i++)
			bz_max[i][j]=max(bz_max[i][j-1],bz_max[bz[i][j-1]][j-1]);
	for(int j=1;j<20;j++)
		for(int i=1;i<=n;i++){
			if(bz_max[i][j-1]==bz_max[bz[i][j-1]][j-1])bz_min[i][j]=max(bz_min[i][j-1],bz_min[bz[i][j-1]][j-1]);
			else if(bz_max[i][j-1]<bz_max[bz[i][j-1]][j-1])bz_min[i][j]=max(bz_max[i][j-1],bz_min[bz[i][j-1]][j-1]);
			else bz_min[i][j]=max(bz_min[i][j-1],bz_max[bz[i][j-1]][j-1]);
		}
	for(int i=1;i<=tmp;i++){
		if(mst[i])continue;
		int maxn=find_max(ed[i].from,ed[i].to),minn=find_min(ed[i].from,ed[i].to);
		if(ed[i].val!=maxn)ans=min(ans,sum+ed[i].val-maxn);
		else if(minn>=0)ans=min(ans,sum+ed[i].val-minn);
	}cout<<ans<<endl;
	return 0;
}

2024/4/5 17:38
加载中...