图 欧拉回路

图 欧拉回路欧拉道路 即一笔画 从图的一个结点出发走出一条道路 每条边恰好经过一次欧拉回路 从任意点出发 最终回到该点的欧拉道路 1 前提 忽略边的方向后 图是连通的 dfs bfs 并查集 2 条件 有向图 最多只有两个点的入度不等于出度 且相差的绝对值是 1 无向图 最多只有两个点的度是奇数 3 若有特殊点 则特殊的点为起点 若无任意点都可为起点寻找路径方法 DFS 构造一般的版本 void

一般的版本

void euler(int u) { for (int v = 0; v < n; ++v) if (G[u][v] && !vis[u][v]) { vis[u][v] = vis[v][u] = 1; euler(v); path.push_back(v); } }

递归版本(图很大,不能用邻接矩阵)

#include<iostream> #include<vector> using namespace std; const int maxn = 10005; const int maxm = ; struct Edge{ int M,vis;//M是u+v Edge(int a = 0,int c = 0) : M(a), vis(c) {}; }; vector<Edge> Edges; vector<int> G[maxn];//G[k]代表k结点相连的路径编号(Edges[]编号) vector<int> path; int n, m,a,b; void euler(int u) { for (int i=0;i<G[u].size();++i) if (!Edges[G[u][i]].vis) { int v = Edges[G[u][i]].M - u; Edges[G[u][i]].vis = 1; euler(v); path.push_back(v); } }

迭代版本(栈溢出的情况下使用)

#include<iostream> #include<vector> using namespace std; const int maxn = 10005; const int maxm = ; struct Edge{ int M,vis; Edge(int a = 0,int c = 0) : M(a), vis(c) {}; }; vector<Edge> Edges; vector<int> G[maxn];//G[k]代表k结点相连的路径编号(Edges[]编号) vector<int> path; int n, m,a,b,i; Edge x; vector<Edge> sta;//代表:M=u,vis=i void euler(int u) { i = 0; while (1) { for (; i<G[u].size(); ++i) if (!Edges[G[u][i]].vis) { int v = Edges[G[u][i]].M - u; Edges[G[u][i]].vis = 1; sta.push_back(Edge(u, i)); u = v; i = 0; break; } if (!i) continue;//只有break下来的i是等于0的,其他都是>0,不存在不连通图的欧拉路径 if (sta.empty()) break; x = sta.back(); sta.pop_back(); u = x.M, i = x.vis; path.push_back(Edges[G[u][i++]].M - u); } }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233885.html原文链接:https://javaforall.net

(0)
上一篇 2025年6月13日 下午8:01
下一篇 2025年6月13日 下午8:22


相关推荐

  • gcc的编译命令_cmake 编译

    gcc的编译命令_cmake 编译GCC编译命令                    —————-加入新公司后,基本上是一键式打包脚本,对于GCC基本上快忘了,重新拾起。GCC命令提供了非常多的命令选项,但并不是所有都要熟悉,初学时掌握几个常用的就可以了,到后面再慢慢学习其它选项,免得因选项太多而打击了学习的信心。一.常用编译命令选项假设源程序文件名为test.c。1…

    2022年10月13日
    5
  • JavaScript 数组排序

    JavaScript 数组排序JavaScript数组排序1、reverse方法2、sort方法1、reverse方法reverse方法会将数组内的元素反序排序。如:letarr=[1,2,3,4,5,6];arr.reverse();//arr=[6,5,4,3,2,1]2、sort方法sort方法默认会将元素当成字符串相互对比,也可以传入自己写的比较函数来决定排序顺序。如:letarr=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19

    2022年6月14日
    33
  • Beta 分布_f分布与beta分布

    Beta 分布_f分布与beta分布相信大家学过统计学的都对正态分布二项分布均匀分布等等很熟悉了,但是却鲜少有人去介绍beta分布的。用一句话来说,beta分布可以看作一个概率的概率分布,当你不知道一个东西的具体概率是多少时,它可以给出了所有概率出现的可能性大小。举一个简单的例子,熟悉棒球运动的都知道有一个指标就是棒球击球率(b

    2025年8月25日
    2
  • 从零开始学习cocoStudio(1)–cocoStudio是什么?

    从零开始学习cocoStudio(1)–cocoStudio是什么?一 cocoStudio 是什么 nbsp nbsp nbsp CocoStudio 是一套专业的永久免费的游戏开发工具集 帮助开发者快速创建游戏资源 将大部分繁琐的游戏开发工作使用编辑器来快速制作 CocoStudio 包含了游戏开发中核心的几个游戏编辑器 UI 编辑器 动画编辑器 场景编辑器 数据编辑器 用于处理游戏中的 UI 界面 动画资源 游戏场景 游戏数据 针对于开发团队中不同的职业进行深度设计 规范了整

    2026年3月18日
    2
  • iPhone 抓包工具Charles使用[通俗易懂]

    iPhone 抓包工具Charles使用[通俗易懂]Charles是在Mac下常用的截取网络封包的工具,在做iOS开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析。Charles通过将自己设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过它来完成,从而实现了网络封包的截取和分析。Charles主要的功能包括:支持SSL代理。可以截取分析SSL的请求。支持流量控制。可以模拟慢速网络

    2022年5月16日
    548
  • 嵌入式学习网站推荐[通俗易懂]

    嵌入式学习网站推荐[通俗易懂]嵌入式学习网站推荐  http://blog.chinaunix.net/uid-2413049-id-158374.html转到这里来是为了自己日后好找:-)2.  TheFirstStopfortheLatestICsandComponents非常好的关于微处理器,DSP,可以编程控制器资讯的网站,更新非常快。强烈推荐一些领导级别的人常去,了解行

    2022年5月23日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号