#12 MLE求助
查看原帖
#12 MLE求助
332123
LHLeisus楼主2023/6/23 21:04
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<utility>
#include<vector>
#include<queue>
#include<limits.h>
#define in inline
#define re register
#define itn int
#define FOR(i,a,b) for(re int i=a;i<=b;i++)
#define ROF(i,a,b) for(re int i=a;i>=b;i--)
#define mp(a,b) make_pair(a,b)
#define int long long
#define pll pair<long long,long long>
#define pii pair<int,int>
using namespace std;
typedef long long ll;
const int N=1e5+5;
const int M=3e5+5;
const ll INF=1e15;
in int read();
int n,m,k;
struct RR{
	int u,v,w;
}edgek[M];
struct E{
	int to,nex,w;
}edge[M];
int head[N],cnt_=0;
void add(int u,int v,int w)
{
	edge[++cnt_].nex=head[u];
	edge[cnt_].w=w;
	edge[cnt_].to=v;
	head[u]=cnt_;
}
bool cmp(RR x,RR y){
	return x.w<y.w;
}
ll W=0;
int f_[N];
int get(int k)
{
	return f_[k]==k?k:f_[k]=get(f_[k]);
}
int vis[N];
int f[N][30];
ll fm[N][30],sm[N][30];
void kruskal()
{
	int cnt=0;
	FOR(i,1,n) f_[i]=i;
	FOR(i,1,m)
	{
		int u=edgek[i].u,v=edgek[i].v;
		ll w=edgek[i].w;
		int fu=get(u);
		int fv=get(v);
		if(fu==fv||u==v) continue;
		f_[fu]=fv;
		cnt++;
		W+=w;
		vis[i]=1;
		add(u,v,w);
		add(v,u,w);
		if(cnt==n-1) break;
	}
}
int dep[N];
void dfs(int u,int fa)
{
	for(int i=1;(1<<i)<=dep[u]+1;i++)
	{
		f[u][i]=f[f[u][i-1]][i-1];
		fm[u][i]=max(fm[u][i-1],fm[f[u][i-1]][i-1]);
		sm[u][i]=max(sm[u][i-1],sm[f[u][i-1]][i-1]);
		if(fm[u][i-1]<fm[f[u][i-1]][i-1]) sm[u][i]=max(sm[u][i],fm[u][i-1]);
		else if(fm[u][i-1]>fm[f[u][i-1]][i-1]) sm[u][i]=max(sm[u][i],fm[f[u][i-1]][i-1]);
	}
	for(int i=head[u];i;i=edge[i].nex)
	{
		int y=edge[i].to;
		if(y==fa) continue;
		dep[y]=dep[u]+1;
		f[y][0]=u;
		fm[y][0]=(ll)edge[i].w;
		dfs(y,u);
	}
}
int LCA(int u,int v)
{
	if(dep[u]<dep[v]) swap(u,v);
	int k=dep[u]-dep[v];
	for(int i=log2(k)+1;i>=0;i--)
		if(k>>i&1) u=f[u][i];
	if(u==v) return u;
	for(int i=log2(dep[u])+1;i>=0;i--)
		if(f[u][i]!=f[v][i])
		{
			u=f[u][i];
			v=f[v][i];
		}
	return f[u][0];
}
ll findmax(int u,int lca,int val)
{
	ll ans=0;
	for(int i=20;i>=0;i--)
	{
		if(dep[f[u][i]]>=dep[lca])
		{
			if(fm[u][i]==val)
				ans=max(ans,sm[u][i]);
			else ans=max(ans,fm[u][i]);
			u=f[u][i];
		}
	}
	return ans;
}
void calc()
{
	ll ans=INF;
	FOR(i,1,m)
	{
		if(vis[i]) continue;
		int u=edgek[i].u;
		int v=edgek[i].v;
		ll w=edgek[i].w;
		if(u==v) continue;
		int lca=LCA(u,v);
		ll a1=findmax(u,lca,w);
		ll a2=findmax(v,lca,w);
		if(max(a1,a2)!=w)
			ans=min(ans,W-max(a1,a2)+w);
	}
	printf("%lld",ans);
}
signed main()
{
	scanf("%lld%lld",&n,&m);
	FOR(i,1,m)
	{
		int u,v,w;
		scanf("%lld%lld%lld",&u,&v,&w);
		edgek[i].u=u;
		edgek[i].v=v;
		edgek[i].w=w;
	}
	sort(edgek+1,edgek+1+m,cmp);
	kruskal();
	dep[1]=1; 
	dfs(1,0);
	calc();
	return 0;
}


in int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return f*x;
}

2023/6/23 21:04
加载中...