49pts 求条
查看原帖
49pts 求条
753640
封禁用户楼主2024/6/9 21:15
#include<bits/stdc++.h>
#define sd std::
#define int long long
#define inf 0x3f3f3f3f
#define linf 1e18
#define il inline
#define db double
#define ldb long double
#define F(i,a,b) for(int i=(a);i<=(b);i++)
#define f(i,a,b) for(int i=(a);i>=(b);i--)
#define MIN(x,y) (x<y?x:y)
#define MAX(x,y) (x>y?x:y)
#define me(x,y) memset(x,y,sizeof x)
#define pii sd pair<int,int>
#define umap(x,y) sd unordered_map<x,y>
#define pque(x) sd priority_queue<x>
#define X first
#define Y second
#define kg putchar(' ')
#define Fr(a) for(auto it:a)
#define dbg(x) sd cout<<#x<<": "<<x<<sd endl
il int read(){int w=1,c=0;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) c=(c<<3)+(c<<1)+ch-48;return w*c;}
void printt(int x){if(x>9) printt(x/10);putchar(x%10+48);}
il void print(int x){if(x<0) putchar('-'),printt(-x);else printt(x);}
il void put(int x){print(x);putchar('\n');}
il void printk(int x){print(x);kg;}
const int N=4e5+10;
int n,m;
struct node
{
	int from;
	int nex;
	int to;
	int dis;
}a[N<<1],e[N<<1];
int tot,head[N];
void add(int u,int v,int w)
{
	a[++tot].nex=head[u];
	head[u]=tot;
	a[tot].to=v;
	a[tot].dis=w;
	a[tot].from=u;
}
int cmp(node x,node y)
{
	return x.dis<y.dis;
}
int fa[N];
int find(int x)
{
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
void merge(int x,int y){fa[find(x)]=fa[find(y)];}
int f[N][30],g[N][30],p[N][30],dep[N];//倍增:祖先,最大值,次大值 
void dfs(int u,int fa,int w)//预处理深度,最大值和次大值以及倍增的祖先数组 
{
	dep[u]=dep[fa]+1;
	f[u][0]=fa;
	g[u][0]=w;
	p[u][0]=-linf;
	F(i,1,20)
	{
//		dbg(f[u][i-1]);
//		dbg(f[f[u][i-1]][i-1]);
		f[u][i]=f[f[u][i-1]][i-1];
		g[u][i]=MAX(g[u][i-1],g[f[u][i-1]][i-1]);
		p[u][i]=MAX(p[u][i-1],p[f[u][i-1]][i-1]);
		if(g[u][i-1]>g[f[u][i-1]][i-1]) p[u][i]=MAX(p[u][i],g[f[u][i-1]][i-1]);
		else if(g[u][i-1]<g[f[u][i-1]][i-1]) p[u][i]=MAX(p[u][i],g[u][i-1]);
	}
	for(int i=head[u];i;i=a[i].nex)
	{
		int v=a[i].to;
		if(v==fa) continue;
		dfs(v,u,a[i].dis);
	}
}
int lca(int x,int y)
{
	if(dep[x]<dep[y]) sd swap(x,y);
	f(i,20,0) if(dep[f[x][i]]>=dep[y]) x=f[x][i];
	if(x==y) return x;
	f(i,20,0)
	{
		if(f[x][i]!=f[y][i])
		{
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
int res,sum,vis[N];
void kruskal()
{
	sd sort(e+1,e+1+m,cmp);
	F(i,1,m)
	{
		int u=e[i].from,v=e[i].to;
		if(find(u)==find(v)) continue;
		vis[i]=1;
		merge(u,v);
		add(u,v,e[i].dis);
		add(v,u,e[i].dis);
		res++;sum+=e[i].dis;
		if(res==n-1) return;
	}
}
int query(int u,int v,int ma) 
{
	int ans=-inf;
	f(i,20,0)
	{
		if(dep[f[u][i]]<=dep[v])
		{
			if(ma!=g[u][i]) ans=MAX(ans,g[u][i]);
			else ans=MAX(ans,p[u][i]);
			u=f[u][i];
		}
	}
	return ans;
}
il void solve()
{
	n=read(),m=read();
	F(i,1,n) fa[i]=i;
	F(i,1,m) e[i].from=read(),e[i].to=read(),e[i].dis=read();
	kruskal();
	dfs(1,0,0);
	int ans=inf;
	F(i,1,m)
	{
		if(vis[i]) continue;
		int u=e[i].from,v=e[i].to;
		int t=lca(u,v);
//		dbg(t);
		int ma1=query(u,t,e[i].dis);
		int ma2=query(v,t,e[i].dis);
//		dbg(ma1);dbg(ma2);
		ans=MIN(ans,sum-MAX(ma1,ma2)+e[i].dis);
//		dbg(ans);
	}
//	dbg(sum);
	put(ans);
}
signed main()
{
	int T=1;
//	T=read();
	while(T--) solve();
    return 0;
}
2024/6/9 21:15
加载中...