欧拉回路的matlab算法,「学习笔记」欧拉回路算法

这篇博客详细介绍了欧拉回路的概念、欧拉图的性质,以及如何使用DFS算法寻找欧拉回路。提供了C++代码实现,并应用于解决「BZOJ 3033」太鼓达人问题,通过构建特定的图并运行欧拉回路找到字典序最小的解决方案。此外,还提及了另一道题目「POI 2010」Bridges(BZOJ 2095)的相关信息。
摘要由CSDN通过智能技术生成

欧拉回路、欧拉图及其判定

在一张图上,一条从某个点出发,经过所有的边后回到原点的路径叫做欧拉回路。有欧拉回路的图叫做欧拉图。

容易发现,欧拉图一定是联通图。它还需要满足以下条件:

如果是无向图,那么每个结点的度数都是偶数。

如果是有向图,那么每个结点的入度和出度相等。

不难理解这是判断欧拉图的充要条件。

欧拉回路算法详解

我们先判断图是否是欧拉图,然后通过 DFS 的方法来找欧拉回路。

DFS 一个点的时候,我们每次找到一条没有使用过的边,然后先 DFS 那个点,再将这条边加入答案栈中。最后将栈中的元素倒序输出即可。

为了优化复杂度,我们使用当前弧优化,不难证明时间复杂度为 $O(n + m)$。

1#include

2#include

3using namespace std;

4

5const int maxn = 1e5, maxm = 4e5;

6int type, n, m, deg[maxn + 3], top, st[maxm + 3];

7int tot, ter[maxm + 3], id[maxm + 3], nxt[maxm + 3], lnk[maxn + 3], cur[maxn + 3];

8bool vis[maxm + 3];

9

10void add(int u, int v, int w){

11ter[++tot] = v, id[tot] = w;

12nxt[tot] = l

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值