当前位置: 首页 > news >正文

每周一算法:无向图的最小环

题目链接

观光之旅

题目描述

给定一张无向图,求图中一个至少包含 3 3 3 个点的环,环上的节点不重复,并且环上的边的长度之和最小。

该问题称为无向图的最小环问题。

你需要输出最小环的方案,若最小环不唯一,输出任意一个均可。

输入格式

第一行包含两个整数 N N N M M M,表示无向图有 N N N 个点, M M M 条边。

接下来 M M M 行,每行包含三个整数 u , v , l u,v,l uvl,表示点 u u u 和点 v v v 之间有一条边,边长为 l l l

输出格式

输出占一行,包含最小环的所有节点(按顺序输出),如果不存在则输出 No solution.

样例 #1

样例输入 #1

5 7
1 4 1
1 3 300
3 1 10
1 2 16
2 3 100
2 5 15
5 3 20

样例输出 #1

1 3 5 2

提示

【数据范围】

1 ≤ N ≤ 100 1≤N≤100 1N100,
1 ≤ M ≤ 10000 1≤M≤10000 1M10000,
1 ≤ l < 500 1≤l<500 1l<500

算法思想

根据题目描述,求的是无向图中的最小环,要求环中至少包含 3 3 3 个节点,且环上的节点不重复。当边权都为正数式,最小环中的节点一定不会重复,否则就不是最小环了,如下图所示。

在这里插入图片描述

求最小环的长度

无向图的最小环问题可以使用「Floyd」算法解决。基本思想是:

  • 当外层循环 k k k刚开始时, d [ i , j ] d[i,j] d[i,j]保存着从节点 i i i j j j经过编号不超过 k − 1 k-1 k1的最短路径长度
  • 此时,如果引入新节点 k k k构成了环,那么环的长度为 d [ i , j ] + g [ j ] [ k ] + g [ k ] [ i ] d[i,j]+g[j][k]+g[k][i] d[i,j]+g[j][k]+g[k][i],如下图所示:
    在这里插入图片描述
    那么, m i n { d [ i , j ] + g [ j ] [ k ] + g [ k ] [ i ] } min\{d[i,j]+g[j][k]+g[k][i]\} min{d[i,j]+g[j][k]+g[k][i]},其中 1 ≤ i < j < k 1\le i\lt j\lt k 1i<j<k,就是满足以下两个条件的最小环长度:
    • 由编号不超过 k k k的节点构成
    • 经过节点 k k k

1 ∼ n 1\sim n 1n枚举 k k k,取上式的最小值,就可以得到整张图的最小环长度。

求最小环上的节点

除了计算最小环之外,题目还要求记录最小环的上所有节点。当更新最小环时,环上的节点包含 i i i i i i j j j之间最短路上的节点,以及 i i i k k k。那么如何得到 i i i j j j之间最短路上的节点

使用Floyd算法计算最短路时,当 d [ i ] [ j ] > d [ i ] [ k ] + d [ k ] [ j ] d[i][j]>d[i][k]+d[k][j] d[i][j]>d[i][k]+d[k][j]时,可以更新节点 i i i j j j的最短路,同时记录节点 i i i j j j的最短路是经过 k k k点中转得到的,不妨记 p o s [ i , j ] = k pos[i,j]=k pos[i,j]=k

那么经过节点 i i i j j j的最短路径的可以分成两个部分:

  • 节点 i i i k k k的最短路
  • 节点 k k k j j j的最短路

可以通过递归的方式,分别获取这两部分经过的节点。

时间复杂度

Floyd算法内可以同时求最小环和最短路,因此时间复杂度为 O ( n 3 ) O(n^3) O(n3)

代码实现

#include <bits/stdc++.h>
using namespace std;
const int N = 105, INF = 0x3f3f3f3f;
int n, m;
int g[N][N], d[N][N];
int pos[N][N];//pos[i][j]表示i和j最短路经过k点中转
vector<int> path; //保存最小环路径
void get_path(int i, int j)
{if(pos[i][j] == 0) return; //i和j之间不存在中转点int k = pos[i][j]; //k是i和j最最短路的中转点get_path(i, k); //递归后取i-k最短路上的节点path.push_back(k);get_path(k, j); //递归后取k-j最短路上的节点
}
int main()
{cin >> n >> m;memset(g, 0x3f, sizeof g); //初始化邻接矩阵for(int i = 1; i <= n; i ++) g[i][i] = 0;while (m -- ){int a, b, c;cin >> a >> b >> c;g[a][b] = g[b][a] = min(g[a][b], c); //无向图,可能存在重边}int ans = INF;memcpy(d, g, sizeof d); //初始化最短路for(int k = 1; k <= n; k ++){//计算由编号不超过k的节点构成的最小环for(int i = 1; i < k; i ++) //枚举环中的点for(int j = i + 1; j < k; j ++){if((long long)d[i][j] + g[j][k] + g[k][i] < ans) //出现更小的环{ans = d[i][j] + g[j][k] + g[k][i];path.clear(); //清除之前的最小环路径path.push_back(k); //k-i-最短路路径-jpath.push_back(i);get_path(i, j);//获取i-j最短路径上的节点path.push_back(j);}}//计算最短路for(int i = 1; i <= n; i ++)for(int j = 1; j <= n; j ++)if(d[i][j] > d[i][k] + d[k][j]){d[i][j] = d[i][k] + d[k][j];pos[i][j] =k; //记录最短路中转点}}if(ans == INF) puts("No solution.");else //存在最小环{for(int i : path) cout << i << " ";}
}

相关文章:

每周一算法:无向图的最小环

题目链接 观光之旅 题目描述 给定一张无向图&#xff0c;求图中一个至少包含 3 3 3 个点的环&#xff0c;环上的节点不重复&#xff0c;并且环上的边的长度之和最小。 该问题称为无向图的最小环问题。 你需要输出最小环的方案&#xff0c;若最小环不唯一&#xff0c;输出…...

分布式websocket IM即时通讯聊天开源项目如何启动

前言 自己之前分享了分布式websocket的视频有同学去fork项目了&#xff0c;自己启动一下更方便理解项目嘛。然后把项目启动需要的东西全部梳理出来。支持群聊单聊,表情包以及发送图片。 支持消息可靠&#xff0c;消息防重&#xff0c;消息有序。同时基础架构有分布式权限&…...

tensorflow学习笔记(1)环境准备写个简单例子(小白手册)-20240506

一、安装python、tensorflow 1、Mac上默认python已经安装,自带pip 2、pip3 install tensorflow 如果报错,提示pip3版本较低,可以根据提示来更新pip3:/Library/Developer/CommandLineTools/usr/bin/python3 -m pip install --upgrade pip 3、然后再使用pip3来安装tensor…...

kubernate 基本概念

一 K8S 是什么&#xff1f; K8S 全称&#xff1a;Kubernetes 1 kubernate基本概念 作用&#xff1a; 用于自动部署、扩展和管理“容器化&#xff08;containerized&#xff09;应用程序”的开源系统。 可以理解成 K8S 是负责自动化运维管理多个容器化程序&#xff08;比如…...

【系统架构师】-选择题(十二)计算机网络

1、网闸的作用&#xff1a;实现内网与互联网通信&#xff0c;但内网与互联网不是直连的 2、管理距离是指一种路由协议的路由可信度。15表示该路由信息比较可靠 管理距离越小&#xff0c;它的优先级就越高&#xff0c;也就是可信度越高。 0是最可信赖的&#xff0c;而255则意味…...

代码随想录|总结篇

完结篇&#xff1a; 60天&#xff0c;还是坚持了下来&#xff0c;达成算法路上的一个小目标。 加入代码随想录训练营之前&#xff0c;也断断续续刷到了树那一章节&#xff0c;但后面因为导师项目等种种情况&#xff0c;一直耽搁到年后。年后打算重新开始刷题时&#xff0c;正好…...

网络编程套接字和传输层tcp,udp协议

认识端口号 我们知道在网络数据传输的时候&#xff0c;在IP数据包头部有两个IP地址&#xff0c;分别叫做源IP地址和目的IP地址。IP地址是帮助我们在网络中确定最终发送的主机&#xff0c;但是实际上数据应该发送到主机上指定的进程上的&#xff0c;所以我们不仅要确定主机&…...

通过wget下载ftp文件

通过wget下载ftp文件 基础用法带密码的http文件带密码的ftp文件补充 基础用法 在下载的过程中会显示进度条&#xff0c;包含百分比&#xff0c;已下载字节&#xff0c;下载速度&#xff0c;剩余时间。 # 下载单个文件 wget [url_file]# 下载目录全部文件 wget [url_dir/*] wg…...

Acrobat Pro DC 2023 for Mac:PDF处理的终极解决方案

Acrobat Pro DC 2023 for Mac为Mac用户提供了PDF处理的终极解决方案。它具备强大的文档处理能力&#xff0c;无论是查看、编辑还是创建PDF文件&#xff0c;都能轻松胜任。在编辑功能方面&#xff0c;Acrobat Pro DC 2023支持对文本、图像进行精准的修改和调整&#xff0c;还能添…...

map容器

目录 map构造和赋值 map大小和交换 map插入和删除 map查找和统计 map排序 map构造和赋值 map中所有元素都是pair&#xff08;即一对&#xff09; pair中第一个元素为key&#xff08;键值&#xff09;&#xff0c;起到索引作用&#xff0c;第二个元素为value&#xff08;…...

GNU/Linux - 是否可以多次打开同一个设备文件

使用设备/dev/ttyS1举例来说明。 一个设备文件打开多次 在 Linux 中&#xff0c;多次打开 /dev/ttyS1 以读取数据通常是可以接受的。多次打开 /dev/ttyS1 并向 /dev/ttyS1 发送数据时&#xff0c;所有打开的文件描述符都能接收数据。每个打开的文件描述符都代表与串行端口的独立…...

Visual Studio的使用方法

目录 1. 下载软件 2. 软件安装 3. 软件使用 4. VS工具的字体背景美化 5. 程序调试 1. 下载软件 官网地址&#xff1a;Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 (microsoft.com) 2. 软件安装 1.选中vs_Professional&#xff0c;鼠标右击选择“以管理员身份…...

【35分钟掌握金融风控策略18】贷前风控策略详解-3

目录 ​编辑 贷前风控数据源 第三方数据 贷前风控数据源 第三方数据 在金融风控过程中&#xff0c;金融机构通常会引入一些第三方的风控数据&#xff08;或第三方金融技术&#xff09;来辅助识别贷款个人或贷款企业的风险状况&#xff0c;帮助金融机构进行风控决策&#x…...

秋招后端开发面试题 - MySQL事务

目录 MySQL事务前言面试题什么是数据库事务为什么要有事务呢&#xff1f;项目中遇到的事务事务的传播机制事务的特性&#xff1f;事务并发存在的问题四大隔离级别四大隔离级别&#xff0c;都会存在哪些并发问题呢数据库是如何保证事务的隔离性的呢&#xff1f;如何解决加锁后的…...

C语言栈的含义与栈数据操作代码详解!

引言&#xff1a;在本篇博客中&#xff0c;我们将学到数据结构——栈&#xff0c;讲到栈的含义与关于栈的数据操作代码。栈可以在顺序表、双向链表以及单链表的基础上实现&#xff0c;而于本篇博客中&#xff0c;我们选择在顺序表的基础上实现栈。 更多有关C语言和数据结构知识…...

数据库基础语法二

一、数据库 1、登陆数据库 2、创建数据库zoo 3、修改数据库zoo字符集为gbk 4、选择当前数据库为zoo 5、查看创建数据库zoo信息 6、删除数据库zoo mysql -uroot -p #登陆数据库 create database zoo; #创建数据库zoo alter database zoo character set gbk collate gbk_…...

数据库的一些知识点

在Sno between列上创建约束,要求Sno的值在18至22岁之间,约束名Sno_CK。请写出对应的完整性命名子句constraint Sno_CK primary key check and。 本题得分&#xff1a; 0分 正确答案&#xff1a; 填空1 : 学号填空2 : snobetween18and22 2.单选题 (12分) 下述SQL命令的短语中…...

[AutoSar]BSW_Com021单帧 首帧 流控帧 连续帧 详解

目录 关键词平台说明一、N_PDU和N_PCI二、单帧三、首帧四、流控帧五、连续帧六、case 关键词 嵌入式、C语言、autosar、OS、BSW、UDS、diagnostic 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c; EB芯片厂商TI 英飞凌编程语言C&#xff0c;C编译器HighTec (…...

CSS学习笔记之中级教程(一)

1、CSS 布局 - display 属性 1.1 display 属性 display 属性是用于控制布局的最重要的 CSS 属性。 display 属性规定是否/如何显示元素。 每个 HTML 元素都有一个默认的 display 值&#xff0c;具体取决于它的元素类型。大多数元素的默认 display 值为 block 或 inline。 …...

Spring Cloud Alibaba 网关 Gateway 集成(7)

项目的源码地址 Spring Cloud Alibaba 工程搭建&#xff08;1&#xff09; Spring Cloud Alibaba 工程搭建连接数据库&#xff08;2&#xff09; Spring Cloud Alibaba 集成 nacos 以及整合 Ribbon 与 Feign 实现负载调用&#xff08;3&#xff09; Spring Cloud Alibaba Ribbo…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...

云原生时代的系统设计:架构转型的战略支点

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、云原生的崛起&#xff1a;技术趋势与现实需求的交汇 随着企业业务的互联网化、全球化、智能化持续加深&#xff0c;传统的 I…...