求助 WA #3 TLE #11 RE 12
查看原帖
求助 WA #3 TLE #11 RE 12
449457
IYSY2009I楼主2023/1/19 16:24
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m;
struct node{
	int u;
	int v;
	int w;
};
node p[300005];
bool cmp(node x,node y){
	return x.w<y.w;
}
int f[100005];
int ff(int x){
	if(f[x]==x) return x;
	f[x]=ff(f[x]);
	return f[x];
}
bool fnd(int x,int y){
	return ff(x)==ff(y);
}
void merge(int x,int y){
	if(!fnd(x,y)) f[ff(x)]=ff(y);
	return;
}
struct edge{
	int nxt;
	int to;
	int w;
	bool tr;
};
edge e[200005];
int h[100005];
int cnt;
void add(int x,int y,int z,bool flag){
	cnt++;
	e[cnt].nxt=h[x];
	h[x]=cnt;
	e[cnt].to=y;
	e[cnt].tr=flag;
	e[cnt].w=z;
	return;
}
long long aans;
void k(){
	for(int i=1;i<=m;i++){
		if(!fnd(p[i].u,p[i].v)){
			merge(p[i].u,p[i].v);
			add(p[i].u,p[i].v,p[i].w,1);
			add(p[i].v,p[i].u,p[i].w,1);
			aans+=p[i].w;
		}
		else{
			add(p[i].u,p[i].v,p[i].w,0);
			add(p[i].v,p[i].u,p[i].w,0);
		}
	}
	return;
}
int fat[20][100005];
int g1[20][100005];
int g2[20][100005];
int dep[100005];
void dfs(int x,int fa){
	fat[0][x]=fa;
	dep[x]=dep[fa]+1;
	for(int i=h[x];i;i=e[i].nxt){
		if(!e[i].tr) continue;
		if(e[i].to!=fa) dfs(e[i].to,x);
		else{
			g1[0][x]=e[i].w;
		}
	}
	return;
}
int mx1,mx2;
void lca(int x,int y){
	mx1=0,mx2=0;
	if(dep[x]<dep[y]) swap(x,y);
	if(dep[x]>dep[y])
		for(int i=19;i>=0;i--)
			if(dep[fat[i][x]]>=dep[y]){
				if(!mx1&&!mx2){
					mx1=g1[i][x];
					mx2=g2[i][x];
				}
				else{
					if(g1[i][x]>mx1){
						mx2=mx1;
						mx1=g1[i][x];
					}
					else if(g1[i][x]>mx2)
						if(mx1!=g1[i][x]) mx2=g1[i][x];
					if(g2[i][x]>mx1){
						mx2=mx1;
						mx1=g2[i][x];
					}
					else if(g2[i][x]>mx2)
						if(mx1!=g2[i][x]) mx2=g2[i][x];
				}
				x=fat[i][x];
			}
	for(int i=19;i>=0;i--){
		if(fat[i][x]!=fat[i][y]){
			if(!mx1&&!mx2){
				mx1=g1[i][x];
				mx2=g2[i][x];
			}
			else{
				if(g1[i][x]>mx1){
					mx2=mx1;
					mx1=g1[i][x];
				}
				else if(g1[i][x]>mx2)
					if(mx1!=g1[i][x]) mx2=g1[i][x];
				if(g2[i][x]>mx1){
					mx2=mx1;
					mx1=g2[i][x];
				}
				else if(g2[i][x]>mx2)
					if(mx1!=g2[i][x]) mx2=g2[i][x];
			}
			if(g1[i][y]>mx1){
				mx2=mx1;
				mx1=g1[i][y];
			}
			else if(g1[i][y]>mx2)
				if(mx1!=g1[i][y]) mx2=g1[i][y];
			if(g2[i][y]>mx1){
				mx2=mx1;
				mx1=g2[i][y];
			}
			else if(g2[i][y]>mx2)
				if(mx1!=g2[i][y]) mx2=g2[i][y];
			x=fat[i][x];
			y=fat[i][y];
		}
	}
	if(g1[0][x]>mx1){
		mx2=mx1;
		mx1=g1[0][x];
	}
	else if(g1[0][x]>mx2)
		if(mx1!=g1[0][x]) mx2=g1[0][x];
	if(g1[0][y]>mx1){
		mx2=mx1;
		mx1=g1[0][y];
	}
	else if(g1[0][y]>mx2)
		if(mx1!=g1[0][y]) mx2=g1[0][y];
	return;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
		scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].w);
	sort(p+1,p+m+1,cmp);
	for(int i=1;i<=n;i++)
		f[i]=i;
	k();
	dfs(1,0);
	for(int i=1;i<=19;i++)
		for(int j=1;j<=n;j++){
			fat[i][j]=fat[i-1][fat[i-1][j]];
			g1[i][j]=max(g1[i-1][j],g1[i-1][fat[i-1][j]]);
			if(g1[i-1][j]!=g1[i-1][fat[i-1][j]]) g2[i][j]=max(g1[i-1][j],g1[i-1][fat[i-1][j]]);
			else g2[i][j]=max(g2[i-1][j],g2[i-1][fat[i-1][j]]);
		}
	long long ans=3e15;
	for(int i=1;i<=n;i++)
		for(int j=h[i];j;j=e[j].nxt){
			if(e[j].tr||i>=e[j].to) continue;
			lca(i,e[j].to);
			if(e[j].w==mx1) ans=min(ans,aans-mx2+e[j].w);
			else ans=min(ans,aans-mx1+e[j].w);
		}
	printf("%lld",ans);
	return 0; 
} 
2023/1/19 16:24
加载中...