蒟蒻求助
查看原帖
蒟蒻求助
181521
珈乐唯毒楼主2020/6/16 17:52

90WA#1qaq

#include<bits/stdc++.h>
using namespace std;
const long long N=2000005;
long long head[N],en,ff[N],scs,logN,bian=10000000000005;
long long find(long long x){
	if(x==ff[x])return x;
	ff[x]=find(ff[x]);
	return ff[x];
}
struct EE{
	long long from,to,val;
}e[6*N];
bool cmp(EE i,EE j){
	if(i.val==j.val){
		if(i.from==j.from)
			return i.to<j.to;
		return i.from<j.from;
	} 
	return i.val<j.val;
}
struct Edge{
	long long next,to,val;
}edge[6*N];
void add(long long from,long long to,long long val){
	edge[++en].to=to;
	edge[en].val=val;
	edge[en].next=head[from];
	head[from]=en;
}
long long n,m,fd[N][30],fc[N][30],f[N][30],dep[N];
bool pd[N];
void dfs(long long u){
	for(long long i=1;i<=logN;i++)
		if(f[u][i-1]){
			f[u][i]=f[f[u][i-1]][i-1];
			long long a=fd[f[u][i-1]][i-1],b=fd[u][i-1],c=fc[f[u][i-1]][i-1],d=fc[u][i-1];
			fd[u][i]=max(a,b);
			if(a==max(a,b))a=0;
			else b=0;
			fc[u][i]=max(a,max(b,max(c,d)));
		}
		else break;
	for(long long i=head[u];i;i=edge[i].next){
		long long v=edge[i].to;
		long long w=edge[i].val;
		if(f[u][0]!=v){
			f[v][0]=u;
			fd[v][0]=w;
			dep[v]=dep[u]+1;
			dfs(v);
		}
	}
	return;
}
long long lca(long long u,long long v){
	if(dep[u]<dep[v])swap(u,v);
	for(long long i=logN;i>=0;i--)
		if(dep[f[u][i]]>=dep[v])
			u=f[u][i];
	if(u==v)return u;
	for(long long i=logN;i>=0;i--)
		if(f[u][i]!=f[v][i]){
			u=f[u][i];
			v=f[v][i];
		}
	return f[u][0];
}
int main(){
	cin>>n>>m;
	for(long long i=1;i<=n;i++)ff[i]=i;
	logN=int(log2(n));
	long long u,v,w;
	for(long long i=1;i<=m;i++){
		scanf("%lld%lld%lld",&u,&v,&w);
		if(u==v)continue;
		e[i].from=u;
		e[i].to=v;
		e[i].val=w;
	}
	sort(e+1,e+m+1,cmp);
	int cnt=0;
	for(long long i=1;i<=m;i++){
		u=e[i].from;
		v=e[i].to;
		if(find(u)==find(v))continue;
		cnt++;
		pd[i]=1;
		scs+=e[i].val;
		add(u,v,e[i].val);
		add(v,u,e[i].val);
		ff[find(u)]=find(v);
		if(cnt==n-1)break;
	}
	dep[1]=1;
	dfs(1);
	for(long long i=1;i<=m;i++){
		if(pd[i]||(e[i].from==e[i-1].from&&e[i].to==e[i-1].to&&e[i].val==e[i-1].val))continue;
		u=e[i].from;
		v=e[i].to;
		w=e[i].val;
		long long lc=lca(u,v);
		long long da1=0,da2=0;
		long long ci1=0,ci2=0;
		for(long long j=logN;j>=0;j--){
			if(dep[f[u][j]]>=dep[lc]){
				da1=max(da1,fd[u][j]);
				ci1=max(ci1,fc[u][j]); 
				u=f[u][j];
			}
		}
		for(long long j=logN;j>=0;j--){
			if(dep[f[v][j]]>=dep[lc]){
				da2=max(da2,fd[v][j]);
				ci2=max(ci2,fc[v][j]);
				v=f[v][j];
			}
		}
		if(max(da1,da2)<w)
			bian=min(w-max(da1,da2),bian);
		else{
			if(max(da1,da2)==da1)da1=0;
			else da2=0;
			if(da1==da2)da1=da2=0;
			bian=min(w-max(da1,max(da2,max(ci1,ci2))),bian);
		}
	}
	cout<<bian+scs;
	return 0;
}
2020/6/16 17:52
加载中...