欧拉路径算法

欧拉图:

对于应该连通图G,有:

1欧拉路径:一条路径,它能够不重复地遍历完所有的边,这个性质很像不重复地一笔画完所有边,所以有些涉及到欧拉路径的问题叫做一笔画问题。

2欧拉回路:一条路径,它能够不重复地遍历完所有的边,并且回到起点,可以看出欧拉回路也是欧拉路径。

3半欧拉图:一个图,图中存在欧拉路径。

4欧拉图(E图):一个图,图中存在欧拉回路,可以看出欧拉图也是半欧拉图。

 先判断欧拉图:

 用希尔霍尔(Hierholzer)算法(基于DFS/套圈法)找欧拉路径/欧拉回路 区别(起点终点是否相同)

如果不是回路那起点固定,如果是回路,那起点不固定。

 

 注意先dfs再入栈

已经判断是无向欧拉图了,下面开始找欧拉回路,代码如下:时间复杂度为O(m*(n+m))

#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
int n, m;
const int maxv = 1005;
const int maxe = 1005;
struct edge {int v, next;int eid;//本条边的编号bool del;//=1说明被遍历过,被删除掉了
}e[maxe * 2];//无向图边×2
int head[maxv];
int cnt;
stack<int>ansv;
void add(int x, int y) {e[cnt].v = y;e[cnt].next = head[x];e[cnt].eid = cnt;e[cnt].del = 0;head[x] = cnt++;
}
void dfs(int x) {for (int i = head[x]; i != -1; i = e[i].next) {if (e[i].del == 1) continue;e[i].del = 1;e[i ^ 1].del = 1;//反向边dfs(e[i].v);}ansv.push(x);
}int main() {int x, y;scanf("%d %d", &n, &m);memset(head, -1, sizeof(head));for (int i = 1; i <= m; i++) {scanf("%d %d", &x, &y);add(x, y);add(y, x);}dfs(1);while (!ansv.empty()) {printf("%d ", ansv.top());ansv.pop();}printf("\n");return 0;
}
//6 9
//1 2
//1 3
//2 3
//3 5
//5 4
//3 4
//4 7
//7 6
//4 6

下面进行弧优化时间复杂度降为O(n+m)

#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
int n, m;
const int maxv = 1005;
const int maxe = 1005;
struct edge {int v, next;int eid;//本条边的编号bool del;//=1说明被遍历过,被删除掉了
}e[maxe * 2];//无向图边×2
int head[maxv];
int cnt;
stack<int>ansv;
void add(int x, int y) {e[cnt].v = y;e[cnt].next = head[x];e[cnt].eid = cnt;e[cnt].del = 0;head[x] = cnt++;
}
//弧优化
void dfs(int x) {//时间复杂度从O((n+m)*m)到O(n+m)for (int i = head[x]; i != -1; i = head[x]) {//巧妙的改动,第二次删掉且不会死循环if (e[i].del == 1) {head[x] = e[i].next;//指向下一条continue;}e[i].del = 1;e[i ^ 1].del = 1;//反向边dfs(e[i].v);}ansv.push(x);
}int main() {int x, y;scanf("%d %d", &n, &m);memset(head, -1, sizeof(head));for (int i = 1; i <= m; i++) {scanf("%d %d", &x, &y);add(x, y);add(y, x);}dfs(1);while (!ansv.empty()) {printf("%d ", ansv.top());ansv.pop();}printf("\n");return 0;
}
//6 9
//1 2
//1 3
//2 3
//3 5
//5 4
//3 4
//4 7
//7 6
//4 6

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

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

相关文章

后端技术选型 sa-token校验学习 下 结合项目学习 后端鉴权

目录 后端注册拦截器 实现对 WebMvcConfigurer 接口的类实现 静态变量 方法重写 注册 Spring Framework拦截器 Sa-Token中SaServletFilter拦截器 思考 为什么使用两个拦截器 1. Spring Framework 拦截器 2. SaServletFilter 为什么要注册两个拦截器&#xff1f; 总结 …

Angular-生命周期及钩子函数

什么是生命周期 Angular 创建和渲染组件及其子组件&#xff0c;当它们绑定的属性发生变化时检查它们&#xff0c;并在从 DOM 中移除它之前销毁它们。生命周期函数通俗的讲就是组件创建、组件更新、组件销毁的时候会触发的一系列的方法。当 Angular 使用构造函数新建一个组件或…

Microsoft

Microsoft Word目录1.目录编号与文字的间距设置2. 目录编号缩进设置 Excel函数MID&#xff08;提取字符&#xff09;CONCAT&#xff08;组合字符串&#xff09;EXACT&#xff08;比较字符串&#xff09; PowerPointwindows 11 恢复右键传统菜单 Word 目录 1.目录编号与文字的…

MAC AndroidStudio模拟器无网络

先确认PC端是正常访问网络的&#xff1b; 模拟器端修改Wifi设置&#xff1a;设置 - 网络和互联网 - WALN设置 按照上图修改&#xff1b; IP设置&#xff1a;从DHCP修改为静态&#xff0c;IP地址&#xff1a;10.0.2.16 &#xff0c;网关&#xff1a;10.0.2.2 &#xff0c; DNS…

Android 对接口的封装使用

前言 本篇文章主要是记录Android代码 对java 接口的封装和使用方法&#xff0c;比较基础&#xff0c;记录一下&#xff0c;阅读本篇文章前&#xff0c;请移步 java基础系列(九) 接口和抽象类 这篇文章。 接口理解 从设计角度: 设计方面的区别 抽象类是对一种事物的抽象&#…

Qiskit快速编程探索(进阶篇)

五、量子电路模拟:探索量子世界的虚拟实验室 5.1 Aer模拟器:强大的模拟引擎 在量子计算的探索旅程中,Aer模拟器作为Qiskit的核心组件之一,宛如一座功能强大的虚拟实验室,为开发者提供了在经典计算机上模拟量子电路运行的卓越能力。它打破了硬件条件的限制,使得研究者无…

如何独立SDK模块到源码目录?

如何独立SDK模块到源码目录&#xff1f; 常见三种构建方式&#xff0c;具体取决于SDK开源程序库的方式&#xff1a; 类UNIX系统平台项目管理工具的进化路径&#xff1a;简单的Makefile>Configure(Autoconf/Automake)>CMake openWrt示例&#xff0c;如下&#xff1a; …

极客说|Azure AI Agent Service 结合 AutoGen/Semantic Kernel 构建多智能体解决⽅案

作者&#xff1a;卢建晖 - 微软高级云技术布道师 「极客说」 是一档专注 AI 时代开发者分享的专栏&#xff0c;我们邀请来自微软以及技术社区专家&#xff0c;带来最前沿的技术干货与实践经验。在这里&#xff0c;您将看到深度教程、最佳实践和创新解决方案。关注「极客说」&am…

MMDetection框架下的常见目标检测与分割模型综述与实践指南

目录 综述与实践指南 SSD (Single Shot MultiBox Detector) 基本配置和使用代码 RetinaNet 基本配置和使用代码 Faster R-CNN 基本配置和使用代码 Mask R-CNN 基本配置和使用代码 Cascade R-CNN 基本配置和使用代码 总结 综述与实践指南 MMDetection是一个基于Py…

服务器数据恢复—EMC存储POOL中数据卷被删除的数据恢复案例

服务器数据恢复环境&故障&#xff1a; EMC Unity 400存储连接了2台硬盘柜。2台硬盘柜上一共有21块硬盘&#xff08;520字节&#xff09;。21块盘组建了2组RAID6&#xff1a;一组有11块硬盘&#xff0c;一组有10块硬盘。 在存储运行过程中&#xff0c;管理员误操作删除了 2组…

Leetcode 377. 组合总和 Ⅳ 动态规划

原题链接&#xff1a;Leetcode 377. 组合总和 Ⅳ 可参考官解 class Solution { public:int combinationSum4(vector<int>& nums, int target) {vector<int> dp(target 1);dp[0] 1;// 总和为 i 的元素组合的个数for (int i 1; i < target; i) {// 每次都…

Ubuntu上,ffmpeg如何使用cuda硬件解码、编码、转码加速

本文使用 Ubuntu 环境。Ubuntu 直接使用 APT 安装的就支持 CUDA 加速。本文使用这样下载的版本进行演示&#xff0c;你自己编译或者其他源的版本可能会不同。 ffmpeg 的一些介绍&#xff0c;以及 macOS 版本的 ffmpeg 硬件加速请见《macOS上如何安装&#xff08;不需要编译安装…

【端云一体化】云函数的使用

前言 为丰富HarmonyOS对云端开发的支持、实现端云联动&#xff0c;DevEco Studio以Cloud Foundation Kit&#xff08;云开发服务&#xff09;为底座、在传统的“端开发”基础上新增“云开发”能力&#xff0c;开发者在创建工程时选择合适的云开发工程模板&#xff0c;即可在De…

vLLM私有化部署大语言模型LLM

目录 一、vLLM介绍 二、安装vLLM 1、安装环境 2、安装步骤 三、运行vLLM 1、运行方式 2、切换模型下载源 3、运行本地已下载模型 四、通过http访问vLLM 一、vLLM介绍 vLLM&#xff08;官方网址&#xff1a;https://www.vllm.ai&#xff09;是一种用于大规模语言模型&#x…

【Linux 之一 】Linux常用命令汇总

Linux常用命令 ./catcd 命令chmodclearcphistoryhtoplnmkdirmvpwdrmtailunamewcwhoami 我从2021年4月份开始才开始真正意义上接触Linux&#xff0c;最初学习时是一脸蒙圈&#xff0c;啥也不会&#xff0c;啥也不懂&#xff0c;做了很多乱七八糟&#xff0c;没有条理的笔记。不知…

蓝牙BT04-A的使用与相关AT指令

一、AT指令没有返回的问题及解决方案 检查指令格式&#xff1a; 确认指令格式是否正确&#xff0c;包括特定的命令和结尾的回车换行符&#xff08;n&#xff09;。 检查TX/RX连接&#xff1a; 确认TX&#xff08;发送&#xff09;和RX&#xff08;接收&#xff09;线是否连接正…

国产Docker可视化面板Dpanel的安装与功能解析

国产Docker可视化面板Dpanel的安装及功能介绍 Docker 可视化面板系统&#xff0c;提供完善的 docker 管理功能。 支持查看基本信息、运行状态统计、网络统计、磁盘统计、用量统计等功能 ​​ ​​ 容器管理&#xff1a; ​​ 创建/修改容器 ​​ 支持基本配置、环境变量、…

金融项目实战 06|Python实现接口自动化——日志、认证开户接口

一、日志封装及应用&#xff08;理解&#xff09; &#x1f534;日志的作用&#xff1a; 记录程序运行的步骤和错误。 &#x1f534;日志的场景&#xff1a; 1、调试bug2、查看程序运行轨迹 &#x1f534;日志基本应用&#xff1a; # 1、导包 import logging # 2、调用日…

第423场周赛:检测相邻递增子数组 Ⅰ、检测相邻递增子数组 Ⅱ、好子序列的元素之和、统计小于 N 的 K 可约简整数

Q1、检测相邻递增子数组 Ⅰ 1、题目描述 给你一个由 n 个整数组成的数组 nums 和一个整数 k&#xff0c;请你确定是否存在 两个 相邻 且长度为 k 的 严格递增 子数组。具体来说&#xff0c;需要检查是否存在从下标 a 和 b (a < b) 开始的 两个 子数组&#xff0c;并满足下…

vue 与 vue-json-viewer 实现 JSON 数据可视化

前言 接口的调试和测试是确保系统稳定性的重要步骤。为了让开发人员和测试人员能够直观地查看接口返回的 JSON 数据&#xff0c;使用合适的工具至关重要。vue-json-viewer 插件为 vue 开发者提供了一个简单而强大的解决方案。本文将详细介绍如何在 vue 项目中使用该插件&#x…