洛谷 P4180 【模板】严格次小生成树

2023-05-16

题目链接

https://www.luogu.org/problem/P4180

分析

根据Kruskal算法的思想,(非)严格次小生成树应该是来自最小生成树的;

具体来说,是将某条非树边加入到MST上,再删去产生的环里原树边中边权最大的一条;

枚举加入的非树边,再用倍增算法求要删去的树边;

但要求严格次小生成树,所以删去的树边不可以和插入的边权值相等,

这样维护树上路径最大值的同时还要维护次大值。

AC代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

inline int read() {
	int num = 0;
	char c = getchar();
	while (c < '0' || c > '9') c = getchar();
	while (c >= '0' && c <= '9')
		num = num * 10 + c - '0', c = getchar();
	return num;
}

const int maxn = 1e5 + 5, maxm = 3e5 + 5;

int head[maxn], eid;

struct Edge {
	int u, v, w, flag, next;

	bool operator < (const Edge& rhs) const {
		return w < rhs.w;
	}
} edge0[maxm], edge[2 * maxn];

inline void insert(int u, int v, int w) {
	edge[++eid].v = v;
	edge[eid].w = w;
	edge[eid].next = head[u];
	head[u] = eid;
}

int fa[maxn], depth[maxn], f[maxn][20], max1[maxn][20], max2[maxn][20];

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

void dfs(int u, int father) {
	for (int i = 1; (1 << i) <= depth[u]; ++i) {
		f[u][i] = f[f[u][i - 1]][i - 1];
		max1[u][i] = max(max1[u][i - 1], max1[f[u][i - 1]][i - 1]);
		if (max1[u][i - 1] == max1[f[u][i - 1]][i - 1])
			max2[u][i] = max(max2[u][i - 1], max2[f[u][i - 1]][i - 1]);
		else max2[u][i] = min(max1[u][i - 1], max1[f[u][i - 1]][i - 1]);
	}
	for (int p = head[u]; p; p = edge[p].next) {
		int v = edge[p].v, w = edge[p].w;
		if (v == father) continue;
		depth[v] = depth[u] + 1;
		f[v][0] = u, max1[v][0] = w;
		dfs(v, u);
	}
}

inline int lca(int x, int y) {
	if (depth[x] < depth[y]) swap(x, y);
	for (int i = 19; i >= 0; --i)
		if (depth[x] - (1 << i) >= depth[y]) x = f[x][i];
	if (x == y) return x;
	for (int i = 19; i >= 0; --i)
		if (f[x][i] != f[y][i]) x = f[x][i], y = f[y][i];
	return f[x][0];
}

inline int get(int x, int y, int l) {
	int ret = 0;
	for (int i = 19; i >= 0; --i)
		if (depth[f[x][i]] >= depth[y]) {
			ret = max(ret, max1[x][i] == l ? max2[x][i] : max1[x][i]);
			x = f[x][i];
		}
	return ret;
}

int main() {
	int n = read(), m = read(), cnt = 0;
	long long sum = 0, ans = 1e18;
	for (int i = 1; i <= m; ++i) {
		edge0[i].u = read(), edge0[i].v = read(), edge0[i].w = read();
		edge0[i].flag = 0;
	}
	sort(edge0 + 1, edge0 + m + 1);
	for (int i = 1; i <= n; ++i) fa[i] = i;
	for (int i = 1; i <= m; ++i) {
		int u = edge0[i].u, v = edge0[i].v, w = edge0[i].w;
		if (find(u) != find(v)) {
			insert(u, v, w), insert(v, u, w);
			u = find(u), v = find(v);
			edge0[i].flag = 1, fa[u] = v, sum += w;
			if (++cnt > n - 1) break;
		}
	}
	memset(depth, -1, sizeof(depth));
	depth[1] = 0;
	dfs(1, 0);
	for (int i = 1; i <= m; ++i)
		if (!edge0[i].flag) {
			int x = edge0[i].u, y = edge0[i].v, z = edge0[i].w, l, d;
			l = lca(x, y), d = max(get(x, l, z), get(y, l, z));
			ans = min(ans, sum - d + z);
		}
	printf("%lld", ans);
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

洛谷 P4180 【模板】严格次小生成树 的相关文章

  • simulink联合STM32CubeMX开发串口通信程序

    摘要 使用SIMULINK联合STM32CubeMX生成STM32F407串口发送数据代码 xff0c 发送的数据为正弦函数波形 再用SIMULINK写一个串口接收数据模型 xff0c 接收来自STM32发送的数据 xff0c 最后绘制出波
  • element 默认主题样式

    使用方法 span class token keyword import span ElementUI span class token keyword from span span class token string 39 elemen
  • 深入RUST标准库内核(一)标准库内容概述

    本书github链接 inside rust std library 本书前面章节 xff1a 深入RUST标准库内核 xff08 序言 深入RUST标准库内核 引言概述本书目的目标读者本书约定 RUST标准库体系概述core库编译器内置i
  • 深入RUST标准库内核(序言)

    对RUST的兴趣来自于Linus认真考虑将RUST作为Linux内核开发语言的新闻报道 因此开始了对RUST探索 xff0c 不久后基本上就从心底里认同了这门语言 xff0c RUST不仅是高性能及安全的语言 xff0c 它的语法设计也会带
  • 手记:把代码上传到Gitee等远程仓库的过程记录及常见问题

    很久没用git了 xff0c 指令都有点生疏了 xff0c 今天上传了一些代码到码云上 xff0c 先把过程记录下来供使用git的朋友参考 没有用图形化界面 xff0c 因为只有熟悉指令才能真正的理解领会 步骤一 xff1a 1 安装git
  • I2C总线协议原理

    首先I2C总线一共分为2根 xff0c 一根是SCL xff08 serial clock xff09 xff0c 还有一根是SDA xff08 serial data xff09 xff0c 一根是用来同步时钟的 xff0c 一根是发送接
  • 常用默认端口+URL解析+HTTP详解

    常用默认端口 http端口80 https端口443 tomcat端口8080 URL详解 http www aspxfans com 8080 news index asp boardID 61 5 amp ID 61 24618 amp
  • Vue3.0 setup函数

    setup 1 Vue3 0中一个新的配置项 xff0c 值为一个函数 2 setup是所有Composition API 组合API 表演舞台 3 组件中所用到的 xff1a 数据 方法等等 xff0c 均要配置在setup中 4 set
  • 【青训营】Go的高质量编程

    Go的高质量编程 本文内容总结自字节跳动青年训练营 第五届 后端组 什么是高质量 xff1f 各种边界条件是否完备异常情况能正常处理 xff0c 稳定性有保障易读易维护 Go语言开发者Dave Cheney指出 xff0c 编程需要遵循以下
  • c++取一个整数a从右端开始的4~7位。(注意考虑多种情况)

    c 43 43 取一个整数a从右端开始的4 xff5e 7位 xff08 注意考虑多种情况 xff09 1 思路分析及原理 4 7位的范围是10 3 10 7 1 xff0c 我们可以利用这个来判断数字的长度 从右端截取一个整数的4 7位

随机推荐

  • 您备案的网站未指向阿里云国内节点(不含香港)服务器,备案号可能被取消接入

    解决方法 xff1a 将你的域名添加一个二级域名 xff0c 解析到某些阿里云国内节点服务器上就行了 例如我博客域名为 www hyzhad com xff0c 就可以添加一个或者两个 A 记录 xff0c 记录值为阿里云国内节点服务器的
  • centos相关软件下载地址

    CentOS7 6 下载地址 CentOS 7 x86 64 DVD 1810 iso CentOS 7 6 DVD 版 4G http mirrors 163 com centos 7 6 1810 isos x86 64 CentOS
  • C++笔记(《C++新经典》)

    C 43 43 新经典 第1章 C C 43 43 1 1 C和C 43 43 语言的起源 特点 关系与讲解范畴1 2 C C 43 43 语言市场需求与就业需求分析1 3 再谈C C 43 43 就业1 4 搭建开发语言环境 第2章 数据
  • FileZilla连接ubuntu

    我新搭建了一个ubuntu 1 查看ssh的状态 xff1a sudo service sshd status 如果出现 xff1a ssh span class token punctuation span service span cl
  • office2016 excel复制粘贴就卡死

    原因 可能和这个帐户的缓存有关系 xff0c 或第三方软件有关系 xff0c 1 xff1a 重新安装office无效 2 xff1a 按照微软 xff0c 点文件 选项 com加载项 把里面复选框都去掉 xff0c 均无效 网上好多类似文
  • 路虽远,行则将至;事虽难,做则必成。

    新年第一天 xff0c 以奋斗为起点
  • Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools“的解决办法

    在Windows系统上使用pip安装一些软件时 xff0c 会出现下面这样的问题 error Microsoft Visual C 43 43 14 0 or greater is required Get it with Microsof
  • tp5 A non-numeric value encountered解决方法

    报错信息如下 解决方法 xff1a 在对应的控制器方法加入下面这行代码即可 ini set 34 error reporting 34 34 E ALL amp E NOTICE 34
  • 自学Python day05-for循环

    语法 for 临时变量 in 序列名 xff1a xxxx 序列的意思是 xff0c 一个数据是由多个数据组成的 xff0c 例如列表 xff1a 1 2 xff0c 3 xff0c 3 xff0c 4 5 xff0c 6 7 xff0c
  • 并查集--解析关押罪犯问题(二)

    在网上看到一道ACM竞赛题 xff0c 很巧妙的运用了并查集解决了一个现实生活的问题 xff0c 然而网上的解析太少 xff0c 在这里贴出来我的思考 xff1a 题目 xff1a S 城现有两座监狱 xff0c 一共关押着N 名罪犯 xf
  • 如何在Windows下安装ubuntu子系统

    TOCM 如何在Windows下安装ubuntu子系统 1 windows设置 首先打开控制面板 xff0c Windows设置 xff0c 勾选Windows下的linux系统 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直
  • R语言批量生成CaseWhen的解决方案

    近期写R代码 xff0c 经常用dplyr case when结合stringr str detect进行条件判断 痛点 xff1a 判断条件可能会改或增删 xff0c 全写在case when里 xff0c 代码冗余且不利于复制和维护 x
  • R新管道操作符 |> 使用体验

    R users应该对magrittr的 gt 管道符都不陌生 然后R官方估计看如此普及不能再装看不见了 xff0c 于是4 1版本官方也出了个管道操作符 gt xff0c 简直就是baseR党的福音啊 虽然我不是忠实的baseR党 xff0
  • R包bs4Dash控件效果对照图

    记录一下bs4Dash各个控件的效果 xff0c 方便查找和对照 案例均来自于官方文档 accordion accordion span class token punctuation span id span class token op
  • 用一个公式列出R语言所有的数据集

    做了个app xff0c 点R datasets快速查看数据集 测试数据 xff0c 经常用到R语言的数据集 xff0c 于是就开始寻思怎么用尽可能短的代码把所有的数据集一次性全列出来 xff0c 再慢慢挑选 代码如下 xff1a data
  • R语言用dbplyr操作数据库解决丢失连接以持久化tbl查询的方案

    在我看来 xff0c R语言tidyverse包里 xff0c 最高价值的包是dbplyr xff08 dplyr的数据库版 xff09 xff0c 用起来非常爽 xff0c 但最怕的是丢失数据库连接 xff0c 一丢则流畅感瞬间崩塌 xf
  • iPad使用UTM SE装Win7

    因工作需要 xff0c 有的公文只能在windows系统下才能通过vpn及专用控件情况下审批 xff0c 带个电脑嫌笨重 xff0c 经测试 xff0c 在ipad上通过虚拟机成功安装win7系统 xff0c 当然还可以安装linux ma
  • Excel内置函数参数为整列是否会有性能损失

    比如 xff0c sumif a a b c c 的性能是否会比限定范围的公式sumif a1 a10 b c1 c10 的性能更差 答案是 xff0c 不会 看微软官方的回答 所以 xff0c 放心大胆的用sumif 43 entire
  • 远程代码执行(RCE)漏洞

    文章目录 1 fastjson 远程代码执行漏洞2 简单复现3 反弹shell3 1 正向反弹shell3 2 反向反弹shell 1 fastjson 远程代码执行漏洞 最近读到一篇文章 fastjson 远程代码执行漏洞分析 xff0c
  • 洛谷 P4180 【模板】严格次小生成树

    题目链接 https www luogu org problem P4180 分析 根据Kruskal算法的思想 xff0c xff08 非 xff09 严格次小生成树应该是来自最小生成树的 xff1b 具体来说 xff0c 是将某条非树边