关于我从只对第一个点到只错第一个点这个事情
查看原帖
关于我从只对第一个点到只错第一个点这个事情
213196
Wens楼主2021/10/10 16:43
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const ll INF=1e17;
const int Maxn=1e5+20;
const int Maxm=3e5+20;

inline ll Max(ll a,ll b){return a>b?a:b;}
inline ll Min(ll a,ll b){return a<b?a:b;}

inline int Read(){
	int x=0;char ch=0;bool w=0;
	while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return w?-x:x;
}

struct node {
	int u,v,w;
};
bool cmp1(node a,node b){return a.w<b.w;}

ll res,ans=INF;
bool use[Maxm];
int n,m;
node e[Maxm];
int nxt[Maxn<<1],to[Maxn<<1],head[Maxn],val[Maxn<<1],tot;
int fa[Maxn][21],w[Maxn][21],w1[Maxn][21],log_2[Maxn];
int depth[Maxn];
int father[Maxn];

int find(int x){
	if(father[father[x]]==father[x])return x;
	return father[x]=find(father[x]);
}

inline void add(int u,int v,int w){
	++tot;
	val[tot]=w;
	to[tot]=v;
	nxt[tot]=head[u];
	head[u]=tot;
	return ;
}

void dfs(int u){
	for(int i=1;i<=log_2[depth[u]];++i){
		fa[u][i]=fa[fa[u][i-1]][i-1];
		w[u][i]=Max(w[u][i-1],w[fa[u][i-1]][i-1]);
		w1[u][i]=Max(w1[u][i-1],w1[fa[u][i-1]][i-1]);
		if(w[u][i-1]>w[fa[u][i-1]][i-1])w1[u][i]=Max(w1[u][i],w[fa[u][i-1]][i-1]);
		else if(w[u][i-1]<w[fa[u][i-1]][i-1])w1[u][i]=Min(w1[u][i],w[u][i-1]);
	}
	for(int i=head[u];i;i=nxt[i]){
		int v=to[i];
		if(fa[u][0]==v)continue;
		depth[v]=depth[u]+1;
		fa[v][0]=u;
		w[v][0]=val[i];
		w1[v][0]=-1000000;
		dfs(v);
	}
	return ;
}

inline int LCA(int u,int v){
	if(depth[u]<depth[v])swap(u,v);
	for(int i=log_2[depth[u]];i>=0;--i){
		if(depth[fa[u][i]]>=depth[v]){
			u=fa[u][i];
		}
	}
	if(u==v)return u;
	for(int i=log_2[depth[u]];i>=0;--i){
		if(fa[u][i]^fa[v][i]){
			u=fa[u][i];
			v=fa[v][i];
		}
	}
	return fa[u][0];
}

inline int qmax(int u,int v,int maxx){
	int t=-10000;
	for(int i=log_2[depth[u]];i>=0;--i){
		if(depth[fa[u][i]]>=depth[v]){
			if(maxx!=w[u][i])t=Max(t,w[u][i]);
			else t=Max(t,w1[u][i]);
			u=fa[u][i];
		}
	}
	return t;
}

int main(){
	n=Read(),m=Read();
	for(int i=1;i<=n;++i){
		log_2[i]=log_2[i-1]+(i==(1<<log_2[i-1]));
	}
	for(int i=1;i<=m;++i){
		e[i].u=Read(),e[i].v=Read(),e[i].w=Read();
	}
	sort(e+1,e+1+m,cmp1);
	for(int i=1;i<=m;++i){
		int u=e[i].u,v=e[i].v,w=e[i].w;
		int fu=find(u),fv=find(v);
		if(fu==fv)continue;
		res+=e[i].w;
		father[fu]=fv;
		add(u,v,w);
		add(v,u,w);
		use[i]=1;
	}
	dfs(1);
	for(int i=1;i<=m;++i){
		if(use[i])continue;
		int lca=LCA(e[i].u,e[i].v);
		int d1=qmax(e[i].u,lca,e[i].w),d2=qmax(e[i].v,lca,e[i].w);
		ans=Min(ans,res-Max(d1,d2)+e[i].w);
	}
	printf("%lld\n",ans);
	return 0;
}
2021/10/10 16:43
加载中...