萌新刚学生成树0.01s,#3#8AC,求调
查看原帖
萌新刚学生成树0.01s,#3#8AC,求调
422996
HeCao2008楼主2023/2/5 22:59
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=5*114514;
struct node{
	int nxt,to,val;
}tree[maxn]; //存图 
struct edge{
	int u,v,w;
	bool used;
}web[maxn]; //存原图 
int head[maxn],top;
int n,m,fa[maxn],minnsum=0;
int id[maxn][30],mx[maxn][30],nxmx[maxn][30],dep[maxn];
bool compare(edge a,edge b){
	return a.w<b.w;
}
void add(int u,int v,int w){
	tree[++top].nxt=head[u];
	tree[top].to=v;
	tree[top].val=w;
	head[u]=top;
}
int find(int x){
	if(x==fa[x])return x;
	else return fa[x]=find(fa[x]);
}
void kruskal(){
	sort(web+1,web+m+1,compare);
	for(int i=1;i<=m;i++){
		int u=find(web[i].u),v=find(web[i].v);
		if(u==v)continue;
		minnsum+=web[i].w;
		add(web[i].u,web[i].v,web[i].w);
		add[web[i].v,web[i].u,web[i].w];
		web[i].used=1;
		fa[v]=u;
	}
}
void dfs(int u){
	dep[u]=dep[id[u][0]]+1;
	for(int i=1;i<=28;i++){
		id[u][i]=id[id[u][i-1]][i-1];
		if(mx[u][i-1]==mx[id[u][i-1]][i-1]){
			mx[u][i]=mx[u][i-1];
			nxmx[u][i]=max(nxmx[id[u][i-1]][i-1],nxmx[u][i-1]);
		}
		if(mx[u][i-1]>mx[id[u][i-1]][i-1]){
			mx[u][i]=mx[u][i-1];
			nxmx[u][i]=max(nxmx[u][i-1],mx[id[u][i-1]][i-1]);
		}
		if(mx[u][i-1]<mx[id[u][i-1]][i-1]){
			mx[u][i]=mx[id[u][i-1]][i-1];
			nxmx[u][i]=max(nxmx[id[u][i-1]][i-1],mx[u][i-1]);
		}
	}
	for(int i=head[u];i;i=tree[i].nxt){
		int v=tree[i].to,w=tree[i].val;
		if(v==id[u][0])continue;
		id[v][0]=u;
		mx[v][0]=w;
		dfs(v);
	}
}
int lca(int u,int v){
	if(dep[u]<dep[v])swap(u,v);
	for(int i=28;i>=0;i--){
		if(dep[u]-dep[v]>=(1<<i))
		u=id[u][i];
	}
	if(u==v)return u;
	for(int i=28;i>=0;i--){
		if(id[u][i]!=id[v][i])u=id[u][i];
		v=id[v][i];
	}
	return id[u][0];
}
int doit(int u,int v,int w){
	int llca=lca(u,v);
	int maxx=0,nxmaxx=0;
	for(int i=28;i>=0;i--){
		if(dep[id[u][i]]>=dep[llca]){
			if(maxx==mx[u][i])nxmaxx=max(nxmx[u][i],nxmaxx);
			if(maxx>mx[u][i])nxmaxx=max(mx[u][i],nxmaxx);
			if(maxx<mx[u][i]){
				nxmaxx=max(nxmx[u][i],maxx);
				maxx=mx[u][i];
			}
			u=id[u][i];
		}
		if(dep[id[v][i]]>=dep[llca]){
			if(maxx==mx[v][i])nxmaxx=max(nxmx[v][i],nxmaxx);
			if(maxx>mx[v][i])nxmaxx=max(mx[v][i],nxmaxx);
			if(maxx<mx[v][i]){
				nxmaxx=max(nxmx[v][i],maxx);
				maxx=mx[v][i];
			}
			v=id[v][i];
		}
	}
	if(w!=maxx)return minnsum-maxx+w;
	if(nxmaxx)return minnsum-nxmaxx+w;
	return 0x7f7f7f7f7f7f7f7f; 
}
signed main(){
	int ans=0x7f7f7f7f7f7f7f7f;
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++)cin>>web[i].u>>web[i].v>>web[i].w;
	for(int i=1;i<=n;i++)fa[i]=i;
	kruskal();
	dfs(1);
	for(int i=1;i<=m;i++){
		if(!web[i].used)
		ans=min(ans,doit(web[i].u,web[i].v,web[i].w));
	}
	cout<<ans<<"\n";
	return 0;
}
2023/2/5 22:59
加载中...