严格次小生成树(LCA+Kruskal)

一、次小生成树

次小生成树是指在给定的无向图中,如果存在最小生成树和次小生成树,那么对于任何一颗最小生成树来看,都存在一颗次小生成树,使得这两棵树只有一条边不同。次小生成树的边权和大于等于最小生成树的另一颗树,也就是边权之和第二小的生成树。如果有严格次小生成树和非严格次小生成树之分,边权之和严格大于最小生成树的且权值最小的树,就是严格次小生成树。若求得的另一颗树与最小生成树权值相等,则为非严格的次小生成树。

非树边w的值域是一定 ≥ ≥ dist1 否则在当w < < <dist1,则之前kruskal求最小生成树的时候把w替换dist1连接a和b,就得到一个更小的生成树(看下图所示)。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


二、如何求次小生成树?

从非树边中找到一条严格大于树边的边取而代之,至于去掉树中哪条边.因为要求数的权值次小,所以我们发现只要去掉树中最大边就可以让树的权值尽可能的小,然后从所有非树边中找一条边取代树中最大的边,每次取一次Min就可以找到次小生成树。


三、LCA+Kruskal

题目:次小生成树

给定一张 N N N个点 M M M条边的无向图,求无向图的严格次小生成树。
设最小生成树的边权之和为 s u m sum sum,严格次小生成树就是指边权之和大于 s u m sum sum的生成树中最小的一个。

输入格式
第一行包含两个整数 N N N M M M

接下来 M M M行,每行包含三个整数 x x x y y y z z z,表示点 x x x和点 y y y之前存在一条边,边的权值为 z z z

输出格式
包含一行,仅一个数,表示严格次小生成树的边权和。(数据保证必定存在严格次小生成树)

数据范围
N ≤ 1 0 5 , M ≤ 3 × 1 0 5 N≤10^5,M≤3×10^5 N105,M3×105
1 ≤ x , y ≤ N 1≤x,y≤N 1x,yN
0 ≤ z ≤ 1 0 6 0≤z≤10^6 0z106
输入样例:
5 6
1 2 1
1 3 2
2 4 3
3 5 4
3 4 3
4 5 6
输出样例:
11

AC代码:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cstdio>
using namespace std;const int N=1e5+10,M=6*N,INF=0x3f3f3f3f;
typedef long long ll;int h[N],e[M],ne[M],w[M],idx;
int n,m;
int p[N];
int f[N][20];  //f[i][j]:i点跳2^j次能跳到的点.
int d1[N][20],d2[N][20];  //d1[i][j]:i点到2^j路径中跳的最大边,d2[i][j]:i点到2^j路径中跳的次大边
int depth[N];
bool st[N];struct Edge{int a,b,c;bool used=false;   //该边是否被在树中bool operator<(const Edge &t)const{return c<t.c;}
}edge[M];//并查集
int find(int x){if(x!=p[x]) p[x]=find(p[x]);return p[x];
}void add(int a,int b,int c){e[idx]=b;w[idx]=c;ne[idx]=h[a];h[a]=idx++;
}//求最小生成树
ll kruskal(){ll res=0;for(int i=1;i<=n;i++) p[i]=i;sort(edge,edge+m);for(int i=0;i<m;i++){int pa=find(edge[i].a),pb=find(edge[i].b),c=edge[i].c;if(pa!=pb){edge[i].used=true;p[pa]=pb;res+=c;}}return res;
}//建立最小生成树图
void build(){memset(h,-1,sizeof h);for(int i=0;i<m;i++){if(edge[i].used){int a=edge[i].a,b=edge[i].b,c=edge[i].c;add(a,b,c);add(b,a,c);}}
}//预处理
void bfs(){memset(depth,0x3f,sizeof depth);queue<int> q;depth[0]=0;depth[1]=1;q.push(1);st[1]=true;while(q.size()){int t=q.front();q.pop();st[t]=false;for(int i=h[t];i!=-1;i=ne[i]){int j=e[i];if(depth[j]>depth[t]+1){depth[j]=depth[t]+1;f[j][0]=t;d1[j][0]=w[i],d2[j][0]=-INF;for(int k=1;k<=16;k++){int one_step=f[j][k-1];f[j][k]=f[one_step][k-1];int dist[]={d1[j][k-1],d2[j][k-1],d1[one_step][k-1],d2[one_step][k-1]};for(int u=0;u<4;u++){int d=dist[u];if(d>d1[j][k]){d2[j][k]=d1[j][k];d1[j][k]=d;}else if(d!=d1[j][k] && d>d2[j][k]) d2[j][k]=d;}}if(!st[j]){q.push(j);st[j]=true;}}}}
}//寻找a和b路径中数的最大边
int lca(int a,int b,int c){int dist[N*3];int cnt=0;if(depth[a]<depth[b]) swap(a,b);for(int k=16;k>=0;k--){if(depth[f[a][k]]>=depth[b]){dist[cnt++]=d1[a][k];dist[cnt++]=d2[a][k];a=f[a][k];}}if(a!=b){for(int k=16;k>=0;k--){if(f[a][k]!=f[b][k]){dist[cnt++]=d1[a][k];dist[cnt++]=d2[a][k];dist[cnt++]=d1[b][k];dist[cnt++]=d2[b][k];a=f[a][k];b=f[b][k];}}//跳的最后一步dist[cnt++]=d1[a][0];dist[cnt++]=d1[b][0];dist[cnt++]=d2[a][0];dist[cnt++]=d2[b][0];}int dist1=-INF,dist2=-INF;for(int i=0;i<cnt;i++){int d=dist[i];if(d>dist1){dist2=dist1;dist1=d;}else if(d!=dist1 && d>dist2){dist2=d;}}if(c!=dist1 && c>dist1) return c-dist1;if(c!=dist2 && c>dist2) return c-dist2;return INF;}int main(){scanf("%d%d",&n,&m);for(int i=0;i<m;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);edge[i]={a,b,c};}ll sum=kruskal();  //最小生成树的权值build();   //建立最小生成树bfs();   //预处理f,depth,d1,d2ll ans=1e18;for(int i=0;i<m;i++){if(edge[i].used==false){int a=edge[i].a,b=edge[i].b,c=edge[i].c;ans=min(ans,sum+lca(a,b,c));}}printf("%lld",ans);return 0;}

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

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

相关文章

RT-DETR 更换骨干网络之 MobileNetV3 | 《搜寻 MobileNetV3》

论文地址:https://arxiv.org/abs/1905.02244 代码地址:https://github.com/xiaolai-sqlai/mobilenetv3 我们展示了基于互补搜索技术和新颖架构设计相结合的下一代 MobileNets。MobileNetV3通过结合硬件感知网络架构搜索(NAS)和 NetAdapt算法对移动设计如何协同工作,利用互…

IntelliJ IDEA如何使用固定地址公网远程访问本地Mysql数据库

文章目录 1. 本地连接测试2. Windows安装Cpolar3. 配置Mysql公网地址4. IDEA远程连接Mysql小结 5. 固定连接公网地址6. 固定地址连接测试 IDEA作为Java开发最主力的工具&#xff0c;在开发过程中需要经常用到数据库&#xff0c;如Mysql数据库&#xff0c;但是在IDEA中只能连接本…

前端面试题集合五(css)

CSS 面试知识点总结 本部分主要是笔者在复习 CSS 相关知识和一些相关面试题时所做的笔记&#xff0c;如果出现错误&#xff0c;希望大家指出&#xff01; 目录 1.介绍一下标准的 CSS 的盒子模型&#xff1f;低版本 IE 的盒子模型有什么不同的&#xff1f;2.CSS 选择符有哪些…

Linux学习记录(二)

组管理和权限管理 组的基本介绍 在Linux中每个用户必须属于一个组&#xff0c;不能独立于组外&#xff1b; 在Linux中每个文件有所有者、所在组、其他组的概念。 一般来说谁创建了文件&#xff0c;谁就是文件的所有者&#xff0c;用户所在组就是该文件的所在组。 查看文件的…

Apache ECharts | 一个数据可视化图表库

文章目录 1、简介1.1、主要特点1.2、使用场景 2、安装方式一&#xff1a;从下载的源代码或编译产物安装方法二&#xff1a;从 npm 安装方法三&#xff1a;⭐定制安装echarts.js 3、使用 官网&#xff1a; 英语&#xff1a;https://echarts.apache.org/en/index.html 中文&a…

Vue-4、单向数据绑定与双向数据绑定

1、单向数据绑定 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>数据绑定</title><!--引入vue--><script type"text/javascript" src"https://cdn.jsdelivr.net/npm/…

linux(ubuntu)中crontab定时器命令详解 以及windows中定时器

linux&#xff08;ubuntu&#xff09;中crontab定时器命令详解 crontab 是一个用于创建、编辑和管理用户的定时任务的命令&#xff0c;它可以让用户在指定的时间自动执行指定的命令或脚本。 基本语法 -e&#xff1a;编辑用户的 crontab 文件&#xff1b;-l&#xff1a;列出用…

【机器学习】常见算法详解第2篇:K近邻算法各种距离度量(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习&#xff0c;伴随浅显易懂的数学知识&#xff0c;让大家掌握机器学习常见算法原理&#xff0c;应用Scikit-learn实现机器学习算法的应用&#xff0…

Java18:网络编程

一.对象序列化&#xff1a; 1.对象流&#xff1a; ObjectInputStream 和 ObjectOutputStream 2.作用&#xff1a; ObjectOutputSteam&#xff1a;内存中的对象-->存储中的文件&#xff0c;通过网络传输出去 ObjectInputStream:存储中的文件&#xff0c;通过网络传输出去…

【漏洞复现】ActiveMQ文件上传漏洞(CVE-2016-3088)

Nx01 产品简介 Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件。ActiveMQ是消息队列服务&#xff0c;是面向消息中间件&#xff08;MOM&#xff09;的最终实现&#xff0c;它为企业消息传递提供高可用、出色性能、可扩展、稳定和安全保障。 Nx02 漏洞描述 Ap…

vercel部署twikoo后评论收不到通知邮件问题解决方法

&#x1f4cc; 前言&#xff1a;本文主要是总结一下在vercel部署twikoo后收不到评论邮件通知问题的解决方法&#xff0c;本人在各种查资料无果后最终去twioo的git官方项目的issue中找到某位大佬给出的原因以及解决方案&#xff0c;故做此记录&#xff0c;希望对遇到此问题的同学…

重学JavaScript高级(八):ES6-ES12新增特性学习

ES6-ES12新增特性学习 ES6–对象字面量增强 属性的简写方法的简写计算属性名 let name "zhangcheng" //我想让sum作为obj的key值 let objKey "sum" let obj {//属性名的简写name//等同于name:name//方法的简写running(){}//等同于running:function()…

ERD助力研发资产沉淀研发提效

一、从痛点中思考答案 痛点一&#xff1a;复杂系统的设计和逻辑碎片化散落&#xff0c;缺少沉淀导致系统后期维护、迭代以及架构升级都非常困难。 痛点二&#xff1a;由于新需求或新项目导致的系统的老旧逻辑梳理往往耗费大量人力&#xff0c;甚至造成人才的流失。 痛点三&a…

React 入门 - 05(响应式与事件绑定)

本章内容 目录 一、响应式设计思想二、React 中的事件绑定 继上一节我们简单实现一个 TodoList来更加了解编写组件的一些细节。本节继续这个案例功能的完成。 一、响应式设计思想 1、在原生的 JS中&#xff0c;如果要实现点击”提交“按钮就将输入框的内容添加至页面列表中&…

什么是协议和什么是OSI模型,以及两者之间的关系

目录 协议 1.协议 2.OSI模型 &#xff08;1&#xff09;什么是OSI模型 &#xff08;2&#xff09;OSI模型和协议之间的关系 总结 &#xff08;3&#xff09;示意图 协议 1.协议 就是双方通过协商&#xff0c;需要共同遵守的约定 协议就是规则&#xff0c;是约定 http…

数字战场上的坚固屏障:雷池社区版(WAF)

黑客的挑战 智能语义分析算法&#xff1a; 黑客们常利用复杂技术进行攻击&#xff0c;但雷池社区版的智能语义分析算法能深入解析攻击本质&#xff0c;即使是最复杂的攻击手法也难以逃脱。 0day攻击防御&#xff1a; 传统防火墙难以防御未知攻击&#xff0c;但雷池社区版能有效…

Spark八:Spark性能优化

Spark性能调优 Spark调优的方法&#xff0c;包括RDD使用、文件读取&#xff0c;partition 学习资料&#xff1a;https://mp.weixin.qq.com/s/caCk3mM5iXy0FaXCLkDwYQ 一、Spark调优之RDD算子调优 1.1 RDD复用 在对RDD进行计算时&#xff0c;要避免相同的算子和计算逻辑下对…

计算机科学速成课【学习笔记】(3)——布尔逻辑和逻辑门

本集课程的B站链接 3. 布尔逻辑 和 逻辑门-Boolean Logic & Logic Gates_哔哩哔哩_bilibili3. 布尔逻辑 和 逻辑门-Boolean Logic & Logic Gates是【计算机科学速成课】[40集全/精校] - Crash Course Computer Science的第3集视频&#xff0c;该合集共计40集&#xff…

当需要视频监控技术升级时,应该如何操作呢?

在当今社会&#xff0c;信息技术的飞速发展为我们提供了前所未有的安全和管理工具&#xff0c;其中视频监控系统无疑是其中一项引人注目的成果。 视频监控系统不仅提高了安全性和生产效率&#xff0c;同时也为社会的可持续发展提供了有力支持。 客户案例 工业生产管理优化 广…

将dumpbin从Visual Studio中抠出来,并使用dumpbin查看exe和dll库的依赖关系

目录 1、初步说明 2、在开发的机器上使用dumpbin工具查看dll库的依赖关系 3、将dumpbin.exe从Visual Studio中抠出来 3.1、找到dumpbin.exe文件及其依赖的dll文件 3.2、在cmd中运行dumpbin&#xff0c;提示找不到link.exe文件 3.3、再次运行dumpbin.exe提示找不到mspdb10…