严格次小生成树 洛谷P4180题解

洛谷 P4180 【模板】严格次小生成树 题目链接 https://www.luogu.org/problem/P4180 分析 根据Kruskal算法的思想,(非)严格次小生成树应该是来自最小生成树的; 具体来说,是将某条非树边加入到MST上,再删去产生的环里原树边中边权最大的一条; 枚举加入的非树边,再用倍增算法求要删去的树边; 但要求严格次小生成树,所以删去的树边不可以和插入的边权值相等, 这样维护树上路径最大值的同时还要维护次大值... 阅读详情

先粘代码,后期更新原理。

#include <cstdio>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;

#define MaxN 100005
#define MaxM 300005
#define LogN 20
#define INF 0x7fffffffffffffffLL

int N, M;

struct EDGE{
    int x, y, f;
    long long z;
    bool operator < (const EDGE &b) const{
        return z < b.z;
    }
}edge[MaxM];

inline long long max(long long a, long long b){
    return a>b ? a : b;
}

inline long long max(long long a, long long b, long long c){
    return max(a, max(b, c));
}

int point[MaxN], tot;
int nxt[MaxM], v[MaxM];
long long w[MaxM];
inline void add(int x, int y, long long z){
    ++tot; nxt[tot] = point[x];
    v[tot] = y; w[tot] = z;
    point[x] = tot;
}

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

long long ans, _ans;
void Kruskal(){
    sort(edge+1, edge+1+M);
    for(register int i = 1; i<=N; ++i) fa[i] = i;
    for(register int i = 1; i<=M; ++i){
        int fx = find(edge[i].x);
        int fy = find(edge[i].y);
        if(fx == fy) continue;
        fa[fx] = fy;
        add(edge[i].x, edge[i].y, edge[i].z);
        add(edge[i].y, edge[i].x, edge[i].z);
        ans += (long long)edge[i].z;
        edge[i].f = 1;
    }
}

int deep[MaxN];
bool flag[MaxN];
int f[MaxN][LogN];
long long g[MaxN][LogN];
long long h[MaxN][LogN];

void dfs(int node, int ff, long long ww, int d){
    deep[node] = d;
    f[node][0] = ff;
    g[node][0] = ww;
    flag[node] = true;
    for(register int i = point[node]; i; i = nxt[i]){
        if(flag[v[i]]) continue;
        dfs(v[i], node, w[i], d+1);
    }
}

struct RES{
    long long max, maxx;
};

RES max_maxx(long long g1, long long g2, long long h1, long long h2){
    RES res;
    if(g1 == g2){
        res.max = g1;
        res.maxx = max(h1, h2);
    }else if(g1 > g2){
        res.max = g1;
        res.maxx = max(g2, h1, h2);
    }else{
        res.max = g2;
        res.maxx = max(g1, h1, h2);
    }
    return res;
}

void process(){
    for(register int j = 1; j<LogN; ++j)
        for(register int i = 1; i<=N; ++i){
            f[i][j] = f[f[i][j-1]][j-1];
            RES res = max_maxx(g[i][j-1], g[f[i][j-1]][j-1], h[i][j-1], h[f[i][j-1]][j-1]);
            g[i][j] = res.max;
            h[i][j] = res.maxx;
        }
}

RES find_LCA(int x, int y){
    RES res = (RES){-1, -1}, tmp = (RES){-1, -1};
    if(deep[x]<deep[y]) swap(x, y);
    for(register int j = LogN-1; j>=0; --j){
        if(deep[f[x][j]]>=deep[y]){
            res = max_maxx(g[x][j], res.max, h[x][j], res.maxx);
            x = f[x][j];
        }
    }
    if(x == y) return res;
    for(register int j = LogN-1; j>=0; --j){
        if(f[x][j] != f[y][j]){
            tmp = max_maxx(g[x][j], g[y][j], h[x][j], h[y][j]);
            res = max_maxx(tmp.max, res.max, tmp.maxx, res.maxx);
            x = f[x][j];
            y = f[y][j];
        }
    }
    tmp = max_maxx(g[x][0], g[y][0], h[x][0], h[y][0]);
    res = max_maxx(tmp.max, res.max, tmp.maxx, res.maxx);
    return res;
}

inline long long read(){
    register long long ans = 0;
    register char c;
    while((c = getchar())==' ' || c=='\n' || c=='\r');
    while((c = getchar())>='0' && c<='9') ans = (ans<<1) + (ans<<3) + c -'0';
    return ans;
}

int main(){
    scanf("%d %d", &N, &M);
    for(register int i = 1; i<=M; ++i) scanf("%d %d %lld", &edge[i].x, &edge[i].y, &edge[i].z);
    for(register int i = 0; i<=N; ++i)
        for(register int j = 0; j<LogN; ++j)
            g[i][j] = h[i][j] = -1;
    Kruskal();
    dfs(1, 0, -1, 1);
    process();
    _ans = INF;
    for(register int i = 1; i<=M; ++i){
        if(edge[i].f) continue;
        RES res = find_LCA(edge[i].x, edge[i].y);
        long long _max = res.max == edge[i].z ? res.maxx : res.max;
        if(_max == -1) continue;
        long long tmp = ans + edge[i].z - _max;
        if(tmp> ans && tmp < _ans) _ans = tmp;
    }
    printf("%lld\n", _ans);
    return 0;
}

 

[算法日常] 次小生成树 次小生成树。。。。。。。。。。。。。。。。。。 阅读详情

相关推荐

干扰管理学习日志4-------信道估计方法 LS(最小二乘)、MMSE(最小均方误差)

信道估计,就是从接收数据中将假定的某个信道模型的模型参数估计出来的过程。如果信道是线性的话,那么信道估计就是对系统冲激响应进行估计。需强调的是信道估计是信道对输入信号影响的一种数学表示,而“好”的信道估计则是使得某种估计误差最小化的估计算法。本文主要讲述非盲信道估计中的LS估计和MMSE估计。LS全称为,即估计的信道参数与实际信道参数的差,进行平方求和后得到的误差累积最小。MMSE估计是LS估计的改进,在LS估计的最终结果的基础上乘以加权矩阵,使之与实际信道参数更为接近。

taiyuezyh的博客 1万+

BJOI2011 严格次小生成树 解题报告

【问题描述】        小C最近学了很多最小生成树的算法,Prim算法、Kurskal算法、消圈算法等等。    正当小C洋洋得意之时,小P又来泼小C冷水了。小P说,让小C求出一个无向图的次小生成树,而且这个次小生成树还得是严格次小的,也就是说:如果最小生成树选择的边集是EM,严格次小生成树选择的边集是ES,那么需要满足:(value(e)表示边e的权值)

cqyz_holiday的博客 669

线阵相机标定必看:如何用Halcon实现亚毫米级精度测量(以HC050标定板为例)

本文以HC050标定板为例,详细阐述了如何利用Halcon实现线阵相机的高精度标定,以达到亚毫米级测量。文章深入剖析了线阵相机标定的核心原理、面临的独特挑战,并提供了从硬件搭建、图像采集到Halcon软件实操的完整路径,重点解析了运动参数设置、精度验证及常见问题排错,为精密测量应用提供系统解决方案。

weixin_29213655的博客 313

洛谷P4180 严格次小生成树

题目描述 小 C 最近学了很多最小生成树的算法,Prim 算法、Kruskal 算法、消圈算法等等。正当小 C 洋洋得意之时,小 P 又来泼小 C 冷水了。小 P 说,让小 C 求出一个无向图的次小生成树,而且这个次小生成树还得是严格次小的,也就是说:如果最小生成树选择的边集是E_MEM​,严格次小生成树选择的边集是E_SES​,那么需要满足:(value(e)value(e)表示边ee的权值)\sum_{e \in E_M}value(e)<\sum_{e \in E_S}value(...

lzx_xzl_______的博客 295

笔记本电脑更换主板后出现2203:System configuration is invalid,以及2201、2202系统错误的解决

主板更换后刷新S/N

晓夏IT笔记 3519

无痛安装及初始配置 PHP 8.0.3 + Apache 2.4 + MySQL 8.0

PHP 8.0.3 + Apache 2.4 + MySQL 8.0MySQL 8.0.23 安装下载安装配置环境变量初始化MySQLPHP8.0.3 安装下载安装配置环境变量Apache 2.4 安装下载安装启动 MySQL 8.0.23 安装 下载 到官方网站下载:https://dev.mysql.com/downloads/mysql/ 目前的最新版本是MySQL 8.0.23 在Windows上有两种安装方式,一个是zip压缩文件解压然后配置,另一个是图像化界面安装。 这里选择第一种方法安装:

Kuang Da's Blog 6208

洛谷P4180 【模板】严格次小生成树[BJWC2010] 题解

虽然中途写的时候有点波折,但是最后一发A,还是有点爽。 这虽然是个模板题,但还是涉及到许多知识的= = 首先我们求出一个最小生成树,并且求出其边权和\(ans\)。那么现在考虑加入其它的边,每次加入在树上就会形成一个环,这时因为是一个生成树,所以我们要删去一条边。很明显现在就要删去最小生成树上最大的边即可。 但这里有个问题,题目要求严格次小。假设现在加入的边权为\(w\),树上在环中的部...

dft539533的博客 198

智能客服系统知识库数据清洗

数据清洗(Data Cleaning)是确保智能客服知识库高效运行的重要环节,主要涉及。| 分类 & 标签优化 | 重新组织 FAQ,创建关键字索引 || 定期更新 | 结合用户反馈,每 1-3 个月优化 |才能提供更优质、正确的回答,提升客户满意度!、Zendesk、Intercom 等)中,: FAQ 或客服回答中可能存在。,会影响 AI 匹配的准确性。是一个持续优化的过程,

z1941563559的博客 2099

严格次小生成树

Problem Solution 做法与求非严格次小生成树类似(枚举非mst上的边来替换mst上的边)。 需要同时维护最大边和严格次大边的倍增数组,不存在严格次大边的情况下需设为-inf,保证此次计算不会作为最终答案。 关于严格次大边倍增数组的递推:取左右区间严格次大边的max,同时若左右区间的最大边不相等,两区间最大边的最小值。 关于求树上两点间的严格次大边:假设待加入边权值为w,每次更新时若区间最大边<w,则用区间最大边更新,否则用区间的严格次大边更新。 Code #include<i

gyp0205的博客 505

【实战技巧】matplotlib中文标签显示问题的3种高效解决方案

本文详细介绍了解决matplotlib中文标签显示问题的3种高效方法,包括修改字体设置、临时指定字体和修改后端配置。针对不同操作系统和环境提供了实用技巧,帮助开发者快速解决中文显示为方框的常见问题,提升数据可视化效果。

weixin_30855099的博客 171

OpenClaw 多机器人多 Agent 模式:打造你的 AI 助手团队

OpenClaw多Agent模式为企业提供高效的AI助手团队解决方案。通过创建4个独立的飞书机器人(主助理、内容创作、技术开发、AI资讯),每个连接专属Gateway和Agent模型(如Claude Opus/Sonnet、Gemini 2.5),实现专业分工。相比单Agent模式,多Gateway架构具有配置清晰、互不干扰、无需手动切换等优势。系统采用Profile隔离机制,各Agent拥有独立配置和端口。部署过程包括创建机器人应用、配置Agent、运行自动化脚本等步骤,支持私聊或群组@使用。日常提供状态

Maynor的博客 5101

P4180 [BJWC2010] 严格次小生成树【题解】

摘要 本文介绍了求解严格次小生成树的算法。严格次小生成树是指边权和严格大于最小生成树但小于其他所有生成树的生成树。关键结论是:严格次小生成树与最小生成树仅相差一条边。算法步骤如下:1) 用Kruskal算法求出最小生成树;2) 对每个不在最小生成树中的边,计算将其加入后形成的环中的最大边(若与新边权值相同则取次大边);3) 通过替换操作得到新的生成树,取其中边权和最小的即为解。采用树上倍增方法优化查询过程,时间复杂度为O(nlogn+mlogn)。

cyx20091026的博客 728

【ArcGIS】07 ArcHydroTools对COM组件的调用返回了错误

在用Arc Hydro Tools提取流域时,在DEM Reconditioning时可能会遇到这个问题: 经过摸索,发现了问题产生的原因: 结果文件保存在了有中文的路径中。 解决的办法: 首先,把ArcGIS切换成英文版 搜索ArcGlS Administrator,以管理员方式打开 点击高级,选择语言为English 其次,新建mxd文档 删除原来的mxd文档,新建mxd文档,放置原来的图层文件。如果不这样做,最后一步的Map Name还会是“图层”这两个汉字。 最后,设置Arc Hydro T

记录专业模型开发、算法程序设计、软件学习笔记、生活日志。 4919

《P4180 [BJWC2010] 严格次小生成树》

摘要:题目要求求解无向图的严格次小生成树,即边权和严格大于最小生成树但小于其他所有生成树的生成树。给定N个点和M条带权边,需要找到这样的生成树并输出其边权和。关键点在于保证次小生成树严格大于最小生成树,且需要对大规模数据(N≤1e5,M≤3e5)高效处理。算法需先求最小生成树,再通过替换非树边并确保严格大于原权值来找到次小生成树。

Jasmine_llq的博客 864

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【题解】洛谷P4180 [BJWC2010] 严格次小生成树(最小生成树+倍增求LCA)

洛谷P4180:https://www.luogu.org/problemnew/show/P4180 前言 这可以说是本蒟蒻打过最长的代码了 思路 先求出此图中的最小生成树 权值为tot 我们称这棵树中的n-1条边为“树边” 其他m-n+1条边为“非树边” 枚举每条非树边(x,y,z)添加到最小生成树中 可以在x,y之间构成一个环 设x,y之间的路径最大值为val1...

186

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

洛谷 P 4180 次小生成树

题目描述 小C最近学了很多最小生成树的算法,Prim算法、Kurskal算法、消圈算法等等。正当小C洋洋得意之时,小P又来泼小C冷水了。小P说,让小C求出一个无向图的次小生成树,而且这个次小生成树还得是严格次小的,也就是说:如果最小生成树选择的边集是EM,严格次小生成树选择的边集是ES,那么需要满足:(value(e)表示边e的权值)\sum_{e \in E_M}value(e)<\s...

日拱一卒,功不唐捐 2829

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Luogu P4180 【模板】严格次小生成树[BJWC2010] 题解

题目大意 %  给定一幅无向图,求其严格次小生成树。   数据范围 点数非负且不超过十的五次方,边数非负且不超过三乘十的五次方,边权非负且不超过十的九次方。 题解 %  回忆Kruskal算法和Prim算法,我们可以得到以下定理(也就是说都是可以被证明的)。 对于图中任意一个点x,对于x点连出去的所有边,边权最小的一条至少存在于一棵最小生成树上。 对于任意一个图,他最小生成树中每种权值的边的数量...

linjiayang2016的博客 266

洛谷 P4180 [BJWC2010]严格次小生成树

题目描述 小C最近学了很多最小生成树的算法,Prim算法、Kurskal算法、消圈算法等等。正当小C洋洋得意之时,小P又来泼小C冷水了。小P说,让小C求出一个无向图的次小生成树,而且这个次小生成树还得是严格次小的,也就是说:如果最小生成树选择的边集是EM,严格次小生成树选择的边集是ES,那么需要满足:和严格小于 这下小 C 蒙了,他找到了你,希望你帮他解决这个问题。 输入格式 第一行包含两个整数N...

zhn_666的博客 318

算法刷题【洛谷P4180 | BJWC2010】严格次小生成树

异想之旅:本人原创博客完全手敲,绝对非搬运,全网不可能有重复;本人无团队,仅为技术爱好者进行分享,所有内容不牵扯广告。本人所有文章仅在优快云、掘金和个人博客(一定是异想之旅域名)发布,除此之外全部是盗文! 洛谷 P4180 [BJWC2010]严格次小生成树 题目描述 小 C 最近学了很多最小生成树的算法,Prim 算法、Kruskal 算法、消圈算法等等。正当小 C 洋洋得意之时,小 P 又来泼小 C 冷水了。小 P 说,让小 C 求出一个无向图的次小生成树,而且这个次小生成树还得是严格次小的,也就是

异想之旅的博客 670

P4180 [BJWC2010] 严格次小生成树

最小生成树 LCA 树上倍增

linlinlin098765的博客 570

洛谷p4180严格次小生成树

题意:求严格的次小生成树 严格次小生成树:(value(e)表示边e的权值)∑e∈EM​​value(e)<∑e∈ES​​value(e)(EM为最小生成树边集,ES为次小生成树边集) 就是次小生成树边权和一定要小于最小生成树, 而非严格的就不一定,也可能等于。 非严格次小生成树求法:是在最小生成树边集外 找到一条边(假设两点为u,v)(一定大于等于最小生...

agyohust791263的博客 245

洛谷 P4180. 严格次小生成树

链接 https://www.luogu.com.cn/problem/P4180 题意 求严格次小生成树 思路 先求出最小生成树 记不在最小生成树里的边为非树边,在最小生成树上添加一条非树边会使这条边的两端 x,yx,yx,y 形成一个环 若这条非树边大于 xxx 到 yyy 的路径上的最大边,那么可以替换它,现在的这颗树就是候选次小生成树 若这条非树边等于 xxx 到 yyy 的路径上的最大边,那么可以替换路径上的次大边,现在的这颗树就是候选次小生成树 因此我们只需要求出每条路径上的最大边和次大边即可

c4Lnn 的 优快云 博客 230

[洛谷P4180]严格次小生成树

题目描述:https://www.luogu.org/problemnew/show/P4180 解析:首先考虑如何求不严格次小生成树,即所求生成树的边权总和大于等于最小生成树的边权总和。发现不严格次小生成树一定由最小生成树上的边替换掉某条边而得,于是想到枚举非树边。发现一条非树边(u,v)只能替换掉最小生成树上路径(u,v)中的最大值。于是问题边转换成了如何求树上路径的最大值,用树剖即可...

weixin_30340353的博客 194

【luogu P4180 严格次小生成树[BJWC2010]】 模板

题目链接:https://www.luogu.org/problemnew/show/P4180 这个题卡树剖。记得开O2。 这个题inf要到1e18。 定理:次小生成树和最小生成树差距只有在一条边上 非严格次小生成树:枚举每一条不在最小生成树上的边,加入到最小生成树中构成一个环。删去这个环上的最大值。(此最大值有可能与加入生成树中的边相等,故为非严格次小生成树。)重复此操作取min,得...

204

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

题目大意:给定一个 N 个顶点,M 条边的带权无向图,求该无向图的一个严格次小生成树。 引理:有至少一个严格次小生成树,和最小生成树之间只有一条边的差异。 题解: 通过引理可以想到一个暴力,即:先求出最小生成树,并记录树边,再枚举删除 MST 中的每一条边,每次重新做一次最小生成树算法,并将计算出来的所有结果取最小值即为答案。以 Kruskal 算法为例,暴力的时间复杂度为 \(O(n^...

K1385170的博客 267
上一篇: 洛谷P1967题解
下一篇: Numpy常用函数汇总
Coder.AN
博客等级 码龄9年 8粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值