萌新刚学OI,有一个点RE,求助
  • 板块学术版
  • 楼主Push_Y
  • 当前回复0
  • 已保存回复0
  • 发布时间2020/9/5 20:11
  • 上次更新2023/11/5 13:41:01
查看原帖
萌新刚学OI,有一个点RE,求助
135485
Push_Y楼主2020/9/5 20:11

P4180

//#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define int long long
#define INF 2147483647000000
#define N 400010
#define M 900010
using namespace std;

inline int gin(){
	char c=getchar();
	int s=0,f=1;
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		s=(s<<3)+(s<<1)+(c^48);
		c=getchar();
	}
	return s*f;
}

int tot=0,head[N],dep[N],n,m,sum=0;
int f[N][19],g[N][19][2];
int fa[N];
bool B[M<<1];

struct node{int u,v,w;}a[M<<1];
struct edge{int ne,v,w;}e[N<<1];

inline void add(int u,int v,int w){
	e[++tot].v=v;
	e[tot].w=w;
	e[tot].ne=head[u];
	head[u]=tot;
}

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

inline int find(int x){
	return fa[x]==x ? fa[x] : fa[x]=find(fa[x]);
}

inline void kruskal(){
	for(int i=1;i<=m;i++){
		int x=find(a[i].u),y=find(a[i].v);
		if(x==y)continue;
		sum+=a[i].w;
		fa[x]=y;
		add(a[i].u,a[i].v,a[i].w);
		add(a[i].v,a[i].u,a[i].w);
		B[i]=true;
	} 
}

inline void dfs1(int u,int fa){
	f[u][0]=fa;
	for(int i=head[u];i;i=e[i].ne){
		int v=e[i].v;
		if(v==fa)continue;
		dep[v]=dep[u]+1;
		g[v][0][0]=e[i].w;
		g[v][0][1]=-INF;
		dfs1(v,u);
	}
}

inline void dfs2(){
	for(int j=1;j<=18;j++)
	for(int i=1;i<=n;i++){
		f[i][j]=f[f[i][j-1]][j-1];
		g[i][j][0]=max(g[i][j-1][0],g[f[i][j-1]][j-1][0]);
		     if(g[i][j-1][0]==g[f[i][j-1]][j-1][0])
			g[i][j][1]=max(g[i][j-1][1],g[f[i][j-1]][j-1][1]);
		else if(g[i][j-1][0]< g[f[i][j-1]][j-1][0])
			g[i][j][1]=max(g[i][j-1][0],g[f[i][j-1]][j-1][1]);
		else 
			g[i][j][1]=max(g[i][j-1][1],g[f[i][j-1]][j-1][0]); 
	}
}

inline int lca(int x,int y){
	if(dep[x]<dep[y])swap(x,y);
	for(int i=18;~i;i--)
		if(dep[f[x][i]]>=dep[y])x=f[x][i];
	if(x==y)return x;
	for(int i=18;~i;i--)
		if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
	return f[x][0];
}

inline int qmax(int u,int v,int d){
	int ret=-INF;
	for(int i=18;~i;i--){
		if(dep[f[u][i]]>=dep[v]){
			if(d!=g[u][i][0])ret=max(ret,g[u][i][0]);
			else ret=max(ret,g[u][i][1]);
			u=f[u][i];
		}
	}
	return ret;
}

signed main(){
	n=gin(),m=gin();
	for(int i=1;i<=m;i++){
		a[i].u=gin(),a[i].v=gin(),a[i].w=gin();
	}
	sort(a+1,a+m+1,cmp);
	for(int i=1;i<=n;i++)fa[i]=i;
	kruskal();
	g[1][0][1]=-INF;
	dep[1]=1;
	dfs1(1,-1);
	dfs2();
	int ans=INF;
	for(int i=1;i<=m;i++){
		if(B[i])continue;
		int u=a[i].u,v=a[i].v,w=a[i].w;
		int yyh=lca(u,v);
		int maxu=qmax(u,yyh,w),maxv=qmax(v,yyh,w);
		ans=min(ans,sum-max(maxu,maxv)+w);
	}
	printf("%lld",ans);
	return 0;
}

2020/9/5 20:11
加载中...