欧拉路径算法

ops/2025/1/15 16:25:11/

欧拉图:

对于应该连通图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.ppmy.cn/ops/150336.html

相关文章

Rank-Analysis——LOL (英雄联盟)排位战绩查询分析器

项目地址&#xff1a; https://github.com/wnzzer/lol-rank-record-analysis 项目采用 Golang electron 前言&#xff1a; lol 战绩查询&#xff0c;一键查询你的混子队友&#xff01; 很早以前就想做这个&#xff0c;最近学了学前端的内容&#xff0c;就拿这个练练手&…

【微服务】面试题 5、分布式系统理论:CAP 与 BASE 详解

分布式系统理论&#xff1a;CAP 与 BASE 详解 一、CAP 定理 背景与定义&#xff1a;1998 年由加州大学科学家埃里克布鲁尔提出&#xff0c;分布式系统存在一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;、分区容错性&#xff08;Part…

ros2笔记-6.5 使用ros2_control驱动机器人

ros2_control 是使用ros2进行机器人控制的框架。简化硬件的集成。 6.5.1 ros2_control安装 为什么要用ros2_contrl.书上、视频上小鱼老师介绍的比较清楚&#xff0c;这里放个control框架图。 安装&#xff1a; sudo apt install ros-$ROS_DISTRO-ros2-control sudo apt ins…

K8S集群常用命令

1&#xff0c;查看pod kubectl get pods -A 查看所有的pod kubectl get pods 这个只查看namespace为default下的pod&#xff0c;也就是只查看默认命名空间下的pod kubectl get pod -A -o wide 查看所有的pod&#xff0c;并且放出的信息更全&#xff08;包含了pod的ip&#xff0…

C++----STL(string)

引言&#xff1a;STL简介 什么是STL STL(standard template libaray-标准模板库)&#xff1a; 是 C标准库的重要组成部分&#xff08;注意&#xff1a;STL只是C标准库里的一部分&#xff0c;cin和cout也是属于C标准库的&#xff09;&#xff0c;不仅是一个可复用的组件库&…

Vue 学习之旅:从基础到实践(vue快速上手+插值表达式+指令上)

Vue 学习之旅&#xff1a;从基础到实践 文章目录 Vue 学习之旅&#xff1a;从基础到实践一、Vue 简介二、创建 Vue 实例与插值表达式&#xff08;一&#xff09;创建 Vue 实例步骤&#xff08;二&#xff09;插值表达式 三、Vue 核心特性 - 响应式四、Vue 指令&#xff08;一&a…

Redis数据结构服务器

Redis数据结构服务器 什么是Redis数据结构服务器 的概念和特点 是一个开源&#xff08;BSD许可&#xff09;&#xff0c;内存中的数据结构存储服务器&#xff0c;可用作数据库、缓存和消息中间件。它支持多种类型的数据结构&#xff0c;如字符串&#xff08;strings&#xff09…

详解英语单词“pro bono”:公益服务的表达(中英双语)

中文版 详解英语单词“pro bono”&#xff1a;公益服务的表达 一、词义解释 “Pro bono” 是一个源自拉丁语的短语&#xff0c;完整表达为 “pro bono publico”&#xff0c;意思是“为了公众利益”&#xff08;for the public good&#xff09;。在现代英语中&#xff0c;它…