80pts求调,WA #4 #5
查看原帖
80pts求调,WA #4 #5
448593
Scorilon楼主2023/7/7 18:42
#include <cstdio>
#include <algorithm>
#include <cstring>

typedef long long ll;
#define int long long

const int N=1e5+5;
const int M=3e5+5;
const int INF=1e15;

struct edge {
	int u,v,w;
	bool is;
}e[M<<1];
int tot;

bool cmp(edge x,edge y) {
	return x.w<y.w;
}

struct node {
	int v,w;
	int next;
}G[M<<1];
int h[N],idx;

void add(int u,int v,int w) {
	G[++idx].v=v;G[idx].w=w;
	G[idx].next=h[u];h[u]=idx;
}

int n,m;
int fa[N];

void init() {
	for(int i=1;i<=n;i++) fa[i]=i;
}

int Find(int x) {
	if(fa[x]==x) return fa[x];
	return fa[x]=Find(fa[x]);
}

ll MST;

void kruscal() {
	int cnt=0;
	std::sort(e+1,e+m+1,cmp);
	init();
	for(int i=1;i<=m;i++) {
		if(cnt==n-1) return;
		int x=e[i].u,y=e[i].v;
		if(x==y) continue;
		if(Find(x)!=Find(y)) {
			fa[Find(x)]=Find(y);
			MST+=e[i].w;cnt++;
			e[i].is=true;
			add(x,y,e[i].w);add(y,x,e[i].w);
		}
	}
}

int f[N][25],maxn[N][25][2],dep[N];

void dfs(int x,int fath) {
	dep[x]=dep[fath]+1;
	f[x][0]=fath;
	for(int k=1;k<=20;k++) {
		if(dep[x]<(1<<k)) break;
		f[x][k]=f[f[x][k-1]][k-1];
		maxn[x][k][0]=std::max(maxn[x][k-1][0],maxn[f[x][k-1]][k-1][0]);
		if(maxn[x][k-1][0]==maxn[f[x][k-1]][k-1][0]) {
			maxn[x][k][1]=std::max(maxn[x][k-1][1],maxn[f[x][k-1]][k-1][1]);
		} else if(maxn[x][k-1][0]<maxn[f[x][k-1]][k-1][0]) {
			maxn[x][k][1]=std::max(maxn[x][k-1][0],maxn[f[x][k-1]][k-1][1]);
		} else {
			maxn[x][k][1]=std::max(maxn[x][k-1][1],maxn[f[x][k-1]][k-1][0]);
		}
	}	
	for(int i=h[x];i;i=G[i].next) {
		int j=G[i].v;
		if(j==fath) continue;
		maxn[j][0][0]=G[i].w;
		maxn[j][0][1]=-INF;
		dfs(j,x);
	}
}

int LCA(int x,int y) {
	if(dep[x]<dep[y]) std::swap(x,y);
	for(int i=20;i>=0;i--) {
		if(dep[f[x][i]]>=dep[y]) x=f[x][i];
	}
	if(x==y) return x;
	for(int i=20;i>=0;i--) {
		if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
	}
	return f[x][0];
}

ll ans=INF;

void minn_MST(int x,int y,int w) {
	int lca=LCA(x,y);
	int maxn1=0,maxn2=0;
	for(int i=0;i<=20;i++) {
		if(dep[f[x][i]]>=dep[lca]) {
			if(maxn[x][i][0]==w) maxn1=std::max(maxn1,maxn[x][i][1]);
			else maxn1=std::max(maxn1,maxn[x][i][0]);
			x=f[x][i];
		} else {
			break;
		}
	}
	ll sum=MST;
	sum=MST+w-maxn1;
	ans=std::min(ans,sum);
	maxn1=0;
	for(int i=0;i<=20;i++) {
		if(dep[f[y][i]]>=dep[lca]) {
			if(maxn[y][i][0]==w) maxn1=std::max(maxn1,maxn[y][i][1]);
			else maxn1=std::max(maxn1,maxn[y][i][0]);
			y=f[y][i];
		} else {
			break;
		}
	}
	sum=MST+w-maxn1;
	ans=std::min(ans,sum);
}

signed main() {
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=m;i++) scanf("%lld%lld%lld",&e[i].u,&e[i].v,&e[i].w);
	kruscal();
	dep[1]=1;
	maxn[1][0][1]=-INF;
	dfs(1,0);
	for(int i=1;i<=m;i++) {
		if(!e[i].is) {
			if(e[i].u==e[i].v) continue;
			minn_MST(e[i].u,e[i].v,e[i].w);
		}
	}
	printf("%lld\n",ans);
	return 0;
}

感觉可能是 minn_MST 函数有点问题,但调了一下午没调出来。

2023/7/7 18:42
加载中...