首页 > 其他分享 >P4180 [BJWC2010] 严格次小生成树

P4180 [BJWC2010] 严格次小生成树

时间:2022-10-15 10:12:32浏览次数:52  
标签:mc max long 生成 maxn maxnc P4180 BJWC2010 mx

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;long long q=2000000000000000000;long long sum=0;
namespace kt{
	struct edge{
		int x,y,z;
		bool operator < (const edge &x)const{
			return z<x.z;
		}
	}e[600001],other[600001],to[600001];
	int h[600001];
	int Cnt;
	void add(int x,int y,int z)
	{
		to[++Cnt]=(edge){h[x],y,z};
		h[x]=Cnt;
	}
	int sdf;
	
	int fa[600001];
	int find(int x){
		return fa[x]==x?x:fa[x]=find(fa[x]);
	}
	
	int dep[600001];
	int f  [600001][22];
	int mx [600001][22];
	int mc [600001][22];
	int cmax(int a,int b,int c,int d)
	{
		int es[4]={a,b,c,d};
		sort(es,es+4);
		int asdf=unique(es,es+4)-es-1;
		if(asdf==1)return -1;//不存在 
		else return es[asdf-1];
	}
	void dfs(int x,int fa)
	{
		dep[x]=dep[fa]+1; 
		for(int i=1; i<=20; i++)
		{
			f[x][i]=f[f[x][i-1]][i-1];
			mx[x][i]=max(mx[x][i-1],mx[f[x][i-1]][i-1]);
			mc[x][i]=cmax(mx[x][i-1],mx[f[x][i-1]][i-1],mc[x][i-1],mc[f[x][i-1]][i-1]);
		}
		for(int i=h[x]; i; i=to[i].x)
		{
			int y=to[i].y;
			if(y==fa)continue;
			f[y][0]=x;
			mx[y][0]=to[i].z;
			mc[y][0]=-1;
			dfs(y,x);
		}
	}
	void lca(int x,int y,int z)
	{
		int maxn,maxnc;
		maxn=maxnc=-1;
		if(x==y)return;
		if(dep[x]<dep[y])swap(x,y);
		for(int i=20; i>=0; i--)
		{
			if(dep[f[x][i]]>=dep[y]){
				maxn=max(maxn,mx[x][i]);
				maxnc=cmax(maxnc,maxn,mx[x][i],mc[x][i]);
				x=f[x][i];
			}
		}
		if(x==y)
		{
			if(maxn<z)q=min(q,sum+z-maxn);
			else if(maxnc!=-1)q=min(q,sum+z-maxnc);
			return;
		}
		for(int i=20; i>=0; i--)
		{
			if(f[x][i]==f[y][i])continue;
			maxn=max(maxn,mx[x][i]);maxnc=cmax(maxn,maxnc,mx[x][i],mc[x][i]);
			maxn=max(maxn,mx[y][i]);maxnc=cmax(maxn,maxnc,mx[y][i],mc[y][i]);
			x=f[x][i],y=f[y][i];
		}
		maxn=max(maxn,mx[x][0]);
		maxnc=cmax(maxnc,mx[x][0],mc[x][0],maxn);
		maxn=max(maxn,mx[y][0]);
		maxnc=cmax(maxnc,mx[y][0],mc[y][0],maxn);
		if(maxn<z)q=min(q,sum+z-maxn);
		else if(maxnc!=-1)q=min(q,sum+z-maxnc);
	}
	
	void work()
	{
		sort(e+1,e+m+1);
		for(int i=1; i<=n; i++)
		{
			fa[i]=i;
		}
		for(int i=1; i<=m; i++)
		{
			int x=e[i].x,y=e[i].y,z=e[i].z;
			int fx=find(x),fy=find(y);
			if(fx!=fy){
				fa[fx]=fy;
				sum+=z;
				add(x,y,z);
				add(y,x,z);
			}
			else
				other[++sdf]=e[i];
		}
		mx[1][0]=-1;
		mc[1][0]=-1;
		dfs(1,0);
		for(int i=1;i<=sdf;i++)
		lca(other[i].x,other[i].y,other[i].z);
		cout<<q<<endl;
	}
}
signed main()
{
	cin>>n>>m;
	for(int i=1; i<=m; i++)
	{
		int x,y,z;
		cin>>x>>y>>z;
		kt::e[i]={x,y,z};
	}
	kt::work();
}

标签:mc,max,long,生成,maxn,maxnc,P4180,BJWC2010,mx
From: https://www.cnblogs.com/dadidididi/p/16793620.html

相关文章

  • Excel如何生成2个随机值,相加始终为指定的固定值?
    Excel情报局职场联盟Excel生产挖掘分享Excel基础技能Excel爱好者大本营用1%的Excel基础搞定99%的职场问题做一个超级实用的Excel公众号Excel是门手艺玩转需要勇气数万Excel......
  • openssl 生成密钥
    1、下载OpenSSL工具地址:http://slproweb.com/products/Win32OpenSSL.html2、配置OpenSSL的环境变量3、生成rsa密钥命令opensslgenrsa-outrsa_private_key.pem2......
  • 内表生成XML简单实例
    REPORTzlm_xml_02.*&---------------------------------------------------------------------**&声明及定义部分*&---------------------------------------------------......
  • 使用Keras生成可变尺寸输入数据的神经网络
    本教程发布于博客园,转载请注明出处!问题:在使用神经网络处理实际数据时,往往遇到数据尺寸不相同的情况。例如:训练得到一个图片去雾模型后,需要对不同尺寸的照片去雾。解决方......
  • 生成会计凭证 ACC_DOCUMENT 增强可能忽略一个问题
    帮人解决一个BAPI_ACC_DOCUMENT_POST创建会计凭证增强的问题,然后整理了以下内容:  "创建凭证的时候经常会用到  extension2 传一些标准bapi接口未提供的值  CALLFU......
  • [译] PEP 255--简单的生成器
     我正打算写写Python的生成器,然而查资料时发现,引入生成器的PEP没人翻译过,因此就花了点时间翻译出来。如果在阅读时,你有读不懂的地方,不用怀疑,极有可能是我译得不到位。......
  • Python 之父的解析器系列之三:生成一个 PEG 解析器
    原题|GeneratingaPEGParser作者|GuidovanRossum(Python之父)译者|豌豆花下猫(“Python猫”公众号作者)声明|本翻译是出于交流学习的目的,基于​​CCBY-NC-SA4.0......
  • 草图实时生成动漫角色!太秀了
    大家好,我是阿潘,上面的演示视频来源推特上面的分享上面的技术大概是图像翻译的应用(例如pix2pix、SPADE、CoCosNet等类似的算法)以pix2pix为例,当我们输入训练集中不存在的轮廓......
  • SHFB-Sandcastle Help File Build vs文档生成工具安装及配置
    SHFB-SandcastleHelpFileBuildvs文档生成工具安装及配置1该软件使用较简单,列出重要步骤,部分省略2软件安装2.2.1安装包SHFBGuidedInstaller_2014.5.31.0.zip......
  • spring boot使用swagger生成api接口文档
    前言在之前的文章中,使用mybatis-plus生成了对应的包,在此基础上,我们针对项目的api接口,添加swagger配置和注解,生成swagger接口文档具体可以查看本站springboot系列文章:s......