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

P4180 [BJWC2010] 严格次小生成树

时间:2023-04-23 21:46:45浏览次数:54  
标签:int max mn numx 生成 P4180 numm BJWC2010 mx

P4180 [BJWC2010] 严格次小生成树

/*
建立一个最小生成树 
维护最大值和严格次小值
然后直接查询就可以了 

5 6
1 2 1 
1 3 2 
2 4 3 
3 5 4 
3 4 3 
4 5 6 

*/

#include <bits/stdc++.h>
using namespace std;
#define int long long
using pii=pair<int,int>;
const int N=1e5+5;

int n,m,ans;
vector<array<int,4>>v;
int h[N],ne[N<<1],e[N<<1],w[N<<1],tot;
int fa[N];
int f[N][21],mx[N][21],mn[N][21],dep[N];

void add(int from,int to,int wi) {
	e[++tot]=to; w[tot]=wi; ne[tot]=h[from]; h[from]=tot;
} 

int find(int x) {
	return x==fa[x]?fa[x]:fa[x]=find(fa[x]);
}

void kruskal() {
	sort(v.begin(),v.end());
	for(int i=1;i<=n;i++)fa[i]=i;
	for(int i=0;i<v.size();i++) {
		int x=v[i][1],y=v[i][2],wi=v[i][0];
		int fx=find(x),fy=find(y);
		if(fx==fy)continue;
		fa[fx]=fy;
		ans+=wi;
		v[i][3]=1;
		add(x,y,wi);
		add(y,x,wi);
	}
}

void dfs(int x,int fa) {
	dep[x] = dep[f[x][0]] + 1;
	for(int i = 1; i <= 20; i++) {
		f[x][i] = f[f[x][i - 1]][i - 1];
		if(mx[x][i - 1] == mx[f[x][i - 1]][i - 1]) {
			mx[x][i] = mx[x][i - 1];
			mn[x][i] = max(mn[f[x][i - 1]][i - 1], mn[x][i - 1]);
		}
		if(mx[x][i - 1] > mx[f[x][i - 1]][i - 1]) {
			mx[x][i] = mx[x][i - 1];
			mn[x][i] = max(mx[f[x][i - 1]][i - 1], mn[x][i - 1]);
		}
		if(mx[x][i - 1] < mx[f[x][i - 1]][i - 1]) {
			mx[x][i] = mx[f[x][i - 1]][i - 1];
			mn[x][i] = max(mx[x][i - 1], mn[f[x][i - 1]][i - 1]);
		}
	}
	for(int i=h[x];i;i=ne[i]) {
		int y = e[i];
		if(y == f[x][0]) continue;
		f[y][0] = x; mx[y][0] = w[i];
		dfs(y,x);
	}
}

int LCA(int x,int y) {
	if(dep[x]<dep[y])swap(x,y);
	for(int i=20;i>=0;i--) {
		if(dep[f[x][i]]>=dep[y])x=f[x][i];
	}
	if(x==y)return x;
	for(int i=20;i>=0;i--) {
		if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
	}
	return f[x][0];
}

int find(int x,int y,int wi) {
	int lca = LCA(x, y);
	int numx = 0; int numm = 0;
	for(int i = 20; i >= 0; i--) {
		if(dep[f[x][i]] >= dep[lca]) {
			if(numx == mx[x][i]) numm = max(numm, mn[x][i]);
			if(numx > mx[x][i]) numm = max(numm, mx[x][i]);
			if(numx < mx[x][i]) 
				numm = max(numx, mn[x][i]), numx = mx[x][i] ;
			x = f[x][i];
		}
		if(dep[f[y][i]] >= dep[lca]) {
			if(numx == mx[y][i]) numm = max(numm, mn[y][i]);
			if(numx > mx[y][i]) numm = max(numm, mx[y][i]);
			if(numx < mx[y][i]) 
				numm = max(numx, mn[y][i]), numx = mx[y][i];
			y = f[y][i];
		}
	}
	//cout<<numx<<' '<<numm<<' '<<wi<<endl;
	if(wi != numx&&numx) return ans - numx + wi;
	else if(numm) return ans - numm + wi;
	else return 1e18;
}

void solve() {
	cin>>n>>m;
	for(int i=1;i<=m;i++) {
		int x,y,wi;
		cin>>x>>y>>wi;
		v.push_back({wi,x,y,0});
	}
	kruskal();
	dfs(1,0);
	//cout<<ans<<endl;
	int res=1e16;
	for(int i=0;i<v.size();i++) {
		if(v[i][3])continue;
		res=min(res,find(v[i][1],v[i][2],v[i][0]));
	}
	cout<<res<<endl;
}

signed main() {
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	solve();
	return 0;
}

标签:int,max,mn,numx,生成,P4180,numm,BJWC2010,mx
From: https://www.cnblogs.com/basicecho/p/17347837.html

相关文章

  • 使用encoder编码器-decoder解码器加GAN网络的生成式图像修复
    论文链接https://openaccess.thecvf.com/content_cvpr_2016/papers/Pathak_Context_Encoders_Feature_CVPR_2016_paper.pdf简介作者提出了一种基于上下文像素预测的无监督视觉特征学习算法,它既完成了特征提取,也完成了图像修复。通过与自动编码器的类比,提出了上下文编码器(Conte......
  • java动态生成页面
    1.java中动态生成html具体适用哪些情况除了发布新闻那些的。答:数据量大,且增删改查频繁的。2.购物网站如果访问量不是很大。商品详细页面是否有必要也动态生成HTML?答:明显有必要,因为商品详细要经常修改,一般不改页面,改的是数据3.如果动态生成了HTML......
  • php实现网站生成桌面快捷方式
    PHP生成桌面快捷方式就是这么的简单,大家生成的时候改下你要生成的网站即可dianji.html代码:<ahref="a.php?url=www.hnzyxok.com&name=美日汇">生成左面快捷方式</a>shengcheng.php代码:<?php//网站生存左面快捷方式---功能$url=$_GET['url'];$filename=urldecode($_GET['n......
  • 原型模式:通过复制生成实例
    原型模式允许对象在不重新创建的情况下通过复制来生成新的实例。这通常比直接创建一个新对象更加高效。简单来说,原型模式就是通过复制一个已有的对象来创建新的对象。首先,我们需要定义一个实现Cloneable接口的原型类,以便使用clone()方法进行复制:publicclassPrototypeimplemen......
  • javamock生成对象
    `importjava.lang.reflect.Field;importjava.lang.reflect.ParameterizedType;importjava.util.ArrayList;importjava.util.Date;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.Random;publicclassMock{privatesta......
  • Python生成requirements.txt方法
    Python生成requirements.txt方法 requirements.txt可以通过pip命令自动生成和安装,这种情况更适用于此项目是单独的虚拟python环境,生成requirements.txt文件。安装requirements.txt依赖:pipinstall-rrequirements.txt1.方法1:生成requirements.txt文件pipfreeze>re......
  • ExtJS 生成 UUID
    更新记录2023年4月23日初始化。ExtJS教程汇总:https://www.cnblogs.com/cqpanda/p/16328016.html生成UUIDletuuid=Ext.data.identifier.Uuid.create().generate();......
  • jmeter3.0 以上生成报告
    在cmd中执行 先进入到jmeter/bin目录中执行这个命令就可以生成已output命名的文件,里面有html的报告jmeter-n-t<testJMXfile>-l<testlogfile>-e-o<Pathtooutputfolder>jmeter-n-ttest.jmx-ltestReport-e-o./output 第二种方法命令先执行jmeter-n......
  • 测试环境服务器配置、生成环境服务器配置、测试机配置
    测试环境服务器配置:CPU:2核  内存:4GB(I/O优化)带宽5Mbps生产环境服务器配置:前端服务器3台配置CPU:4核  内存:4GB 带宽20Mbps;后端2台配置 CPU:4核  内存:8GB 带宽5Mbps测试机配置:CPU:8核内存:16G Speed:1000Mb/s......
  • Unity框架:JKFrame2.0学习笔记(十)——自动生成资源引用代码(2)
    前言上一篇记录了自动生成资源引用代码的内部实现,主要是针对addressable的资源系统的,为了在加载时不会因为名字写错,加载错,也更加方便的使用addressable加载,这一篇记录下如何使用。如何使用之前看过,在编辑器中添加了工具按钮我们可以在addressable的groups面板上添加几个测试资源我......