Unaccepted 100pts 求调
查看原帖
Unaccepted 100pts 求调
996068
goodmoon楼主2023/8/19 17:45
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,cnt,s,ans=1e15,f[100005],head[100005],mst[300005],fa[100005][20],lg[100005],dep[100005],st[100005][20],st_nxt[100005][20];
struct g{
	int u,v,w;
	bool operator <(const g tmp) const{
		return w<tmp.w;
	}
}G[300005];
struct Edge{
	int to,nxt,w;
}edge[200005];
void add(int u,int v,int w){
	edge[++cnt]={v,head[u],w};
	head[u]=cnt;
}
int find(int x){
	if(x==f[x]) return x;
	return f[x]=find(f[x]);
}
void kruskal(){
	int tot=0;
	for(int i=1;i<=m;i++){
		int a=find(G[i].u);
		int b=find(G[i].v);
		if(a!=b){
			f[a]=b;
			tot++;
			add(G[i].u,G[i].v,G[i].w);
			add(G[i].v,G[i].u,G[i].w);
			s+=G[i].w;
			mst[i]=1;
		}
		if(tot==n-1) return;
	}
}
void Log(){
	lg[1]=0;
	for(int i=2;i<=n;i++) lg[i]=lg[i/2]+1;
}
void dfs(int u,int fath,int w){
	if(fath==-1) dep[u]=1;
	else dep[u]=dep[fath]+1;
	fa[u][0]=fath;
	st[u][0]=w;
	for(int i=1;i<=lg[dep[u]];i++){
		fa[u][i]=fa[fa[u][i-1]][i-1];
		st[u][i]=max(st[u][i-1],st[fa[u][i-1]][i-1]);
		st_nxt[u][i]=max(st_nxt[u][i-1],st_nxt[fa[u][i-1]][i-1]);
		if(st[u][i-1]>st[fa[u][i-1]][i-1]) st_nxt[u][i]=max(st_nxt[u][i],st[fa[u][i-1]][i-1]);
		else if(st[u][i-1]<st[fa[u][i-1]][i-1]) st_nxt[u][i]=max(st_nxt[u][i],st[u][i-1]);
	}
	for(int i=head[u];i;i=edge[i].nxt){
		int v=edge[i].to;
		if(v==fath) continue;
		dfs(v,u,edge[i].w);
	}
}
int lca(int u,int v){
	if(dep[u]<dep[v]) swap(u,v);
	while(dep[u]!=dep[v]) u=fa[u][lg[dep[u]-dep[v]]];
	if(u==v) return u;
	for(int i=lg[dep[u]];i>=0;i--){
		if(fa[u][i]!=fa[v][i]){
			u=fa[u][i];
			v=fa[v][i];
		}
	}
	return fa[u][0];
}
int query(int u,int LCA,int maxx){
	int res=0;
    for(int i=lg[dep[u]];i>=0;i--){
		if(dep[fa[u][i]]>=dep[LCA]){
			if(maxx!=st[u][i]) res=max(res,st[u][i]);
			else res=max(res,st_nxt[u][i]);
			u=fa[u][i];
		}
	}
	return res;
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1,u,v,w;i<=m;i++){
		scanf("%lld%lld%lld",&u,&v,&w);
		if(u==v){
			m--;
			continue;
		}
		G[i]={u,v,w};
	}
	sort(G+1,G+m+1);
	for(int i=1;i<=n;i++) f[i]=i;
	kruskal();
	Log();
	dfs(1,-1,0);
	for(int i=1,u,v,w,lcax,tmp;i<=m;i++){
		if(mst[i]) continue;
		u=G[i].u,v=G[i].v,w=G[i].w,lcax=lca(u,v);
		tmp=max(query(u,lcax,w),query(v,lcax,w));
		if(tmp!=w) ans=min(ans,s-tmp+w);
	}
	printf("%lld",ans);
	return 0;
}
2023/8/19 17:45
加载中...