P4180 [BJWC2010]题解

news/2024/10/5 0:06:04/文章来源:https://www.cnblogs.com/Jefferyz/p/18447504

传送门:https://www.luogu.com.cn/problem/P4180

类似于CF1108F,而由于严格次小,可能出现非树边与生成树上最大边权相同的情况,我们需要预处理树上最大和严格次大边。

#include <bits/stdc++.h>#define int long long
#define inf 0x3f3f3f3f3f3f3f3fusing namespace std;
const int N = 6e5 + 10;inline int read() {char c;bool flag = false;while ((c = getchar()) < '0' || c > '9') if (c == '-') flag = true;int res = c - '0';while ((c = getchar()) >= '0' && c <= '9') res = (res << 3) + (res << 1) + c - '0';return flag ? -res : res;
}struct E {int u, v, w, used;bool operator<(const E &other) const { return w < other.w; }
} e[N];int pa[N], head[N], cnt, dep[N], fa[N][26], Max[N][26][2];int get(int u) { return pa[u] == u ? u : pa[u] = get(pa[u]); }struct Edge {int to, next, w;
} edge[N];void add_edge(int u, int v, int w) {edge[cnt].w = w;edge[cnt].to = v;edge[cnt].next = head[u];head[u] = cnt++;
}void dfs(int x, int f) {dep[x] = dep[f] + 1;fa[x][0] = f;Max[x][0][1] = -inf;for (int i = 1; i <= 25; ++i) {fa[x][i] = fa[fa[x][i - 1]][i - 1];int temp[4] = {Max[x][i - 1][0], Max[fa[x][i - 1]][i - 1][0], Max[x][i - 1][1], Max[fa[x][i - 1]][i - 1][1]};sort(temp, temp + 4);Max[x][i][0] = temp[3];Max[x][i][1] = temp[2] == temp[3] ? temp[1] : temp[2];}for (int i = head[x]; ~i; i = edge[i].next) {int y = edge[i].to, w = edge[i].w;if (y == f) continue;Max[y][0][0] = w;Max[y][0][1] = -inf;dfs(y, x);}
}int getAns(int x, int lca, int val) {int m0 = -inf, m1 = -inf;for (int i = 25; i >= 0; --i) {if (dep[fa[x][i]] >= dep[lca]) {if (Max[x][i][0] > m0) m1 = max(m0, Max[x][i][1]), m0 = Max[x][i][0];else if (Max[x][i][0] > m1 && Max[x][i][0] != m0) m1 = Max[x][i][0];else if (Max[x][i][0] > m1 && Max[x][i][0] == m0) m1 = max(Max[x][i][1], m1);x = fa[x][i];}}//cout << "m0:" << m0 << " m1:" << m1 << " val:" << val << endl;//if (m1 == m0 && m1 != -inf) cout << "SOS";return m0 == val ? m1 : m0;
}int lca(int x, int y) {if (dep[x] < dep[y]) swap(x, y);for (int i = 25; i >= 0; --i) {if (dep[fa[x][i]] >= dep[y]) x = fa[x][i];}if (x == y) return x;for (int i = 25; i >= 0; --i) {if (fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];}return fa[x][0];
}signed main() {memset(head, -1, sizeof head);int n = read(), m = read();for (int i = 1; i <= m; ++i) {e[i].u = read(), e[i].v = read(), e[i].w = read();pa[i] = i;}sort(e + 1, e + m + 1);int ans = inf, res = 0;for (int i = 1; i <= m; ++i) {int u = e[i].u, v = e[i].v;if (get(u) != get(v)) {pa[get(u)] = get(v);add_edge(u, v, e[i].w);add_edge(v, u, e[i].w);res += e[i].w;e[i].used = 1;}}dfs(1, 0);for (int i = 1; i <= m; ++i) {if (!e[i].used && e[i].u != e[i].v) {//cout << e[i].w << endl;int LCA = lca(e[i].u, e[i].v);int tmp = max(getAns(e[i].u, LCA, e[i].w), getAns(e[i].v, LCA, e[i].w));if (tmp <= -inf) continue;ans = min(ans, res + e[i].w - tmp);//cout << "tmp:" << tmp << " Res:" << res + e[i].w - tmp << endl;}}printf("%lld\n", ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/808116.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPS股票价格查询EXCEL表格

第一步在表格内使用公式=GetStockSource(Stock_code)查询股票的即时交易信息,Stock_code表示股票代码;第二步通过公式从Source中提取所需要的数据,可以提取股票名称、价格、涨跌幅、收盘价格、成交额、成交量、换手率等。 公式如下: GetStockSource(Stock_code),查询股票即…

【2024.10.4 闲话】0/99+

当符卡收取100次后,收率显示会从xx/99+变为master,收率master是成为神触第一步呢(笑)。今日推歌:没有。明天可能有。 今日 set:也没有。话说应该没人知道 set 是什么吧,总之不是 std::set。[ARC176E] Max Vector 给你两个长度为 \(N\) 的正整数序列: \(X=(X_1,X_2,\dot…

2024 ciscn WP

一、MISC1.火锅链观光打卡打开后连接自己的钱包,然后点击开始游戏,答题八次后点击获取NFT,得到有flag的图片没什么多说的,知识问答题兑换 NFTFlag{y0u_ar3_hotpot_K1ng}2.Power Trajectory Diagram方法1:使用py中的numpy和pandas库读取npz文件并保存为csv文件,代码如下:…

30. 协程

1.协程的概念 1.1 定义 进程是操作系统内部运行的程序 线程是进程内部运行的程序 协程是线程内部运行的程序 协程是单线程下的并发,又成微线程,英文名coroutine 1.2 协程的优点协程切换的开销更小 GIL锁导致同一时刻只能运行一个线程,一个线程内不会限制协程数,单线程就可以…

.net core 安装服务

https://www.jianshu.com/p/e1b3b61f876a使用NSSM 后面的代码演示以Asp.net Core 2.1作为演示,其他.Net Core方式一致。 1、确保.Net Core程序可以正常运行 先把Asp.net Core发布,然后直接运行dotnet命令,确保程序可以运行并访问 2、使用NSSM安装dotnet 下载NSSM,使用命…

vs2015安装包丢失或损坏解决工具 或者不能启动

打开“本地组策略编辑器”(gpedit.msc)。展开“计算机配置”>“管理模板”>“系统”>“Internet 通信管理”,然后选择“Internet 通信设置”。选择“关闭自动根证书更新”>,“禁用”,然后选择“确定”或“应用”。  下载最新的组件版本(备份的) https://lea…

uboot 启动自编写程序的方式

uboot 启动自编写程序的方式 uboot 存在 boot 命令。 自己最初在尝试撰写串口程序时,选择了使用汇编来完成。 在这段时间,自己使用 go 命令来尝试载入程序 先是在 Ubuntu 上搭建 tftp 目录 # /etc/default/tftpd-hpaTFTP_USERNAME="tftp" TFTP_DIRECTORY="/ho…

10.Java集合框架_List接口

集合与数组的区别数组:长度开始时必须指定,而且一旦指定,不能修改。 保存的必须为同一类型的元素。 使用数组进行增加/删除元素比较麻烦。集合:可以动态保存任意多个对象,使用比较方便。 提供了一系列方便操作对象的方法: add、remove、set、get。 使用集合添加,删除新元…

20240924

[牛半仙的妹子 Tree(tree)](http://ac.robo-maker.cn/d/contest/p/ZY1044?tid=66f28cd11bca2159e88c8fb0) 我们会发现其实牛半仙发癫时就等于将以前的标记清空,从头开始,所以我们可以考虑根号分治,如果两个牛半仙发癫的时间间隔小于 \(\sqrt n\) ,那么我们可以直接暴力枚举两…

『模拟赛』冲刺CSP联训模拟2

『模拟赛记录』冲刺CSP联训模拟2Rank 不重要了A. 挤压 你说的对,期望怎么能算签呢? 一个重要的性质:一个数的平方可以在二进制下表示为 \(\sum_{i,j}\ s_i\ s_j\ 2^{i+j}\),所以就可以分别求每一位对答案的贡献了。 设 \(f_{i,1/0,1/0}\) 表示到第 \(i\) 个数我们枚举的两位…

PbootCms上传图片变模糊、上传图片尺寸受限的解决方案

在使用PbootCMS的过程中,如果上传的图片被压缩变得模糊,通常是因为上传的图片尺寸过大。PbootCMS 默认的上传图片限制宽度为 1920 像素,缩略图的限制大小为 10001000 像素。可以通过调整这些参数来解决这个问题。 解决方案打开 config.php 文件 调整 max_width 和 max_heigh…