图 欧拉回路

图 欧拉回路欧拉道路 即一笔画 从图的一个结点出发走出一条道路 每条边恰好经过一次欧拉回路 从任意点出发 最终回到该点的欧拉道路 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Jetson Nano 从入门到实战(案例:Opencv配置、人脸检测、二维码检测)

    Jetson Nano 从入门到实战(案例:Opencv配置、人脸检测、二维码检测)目录1.JetsonNano简介2.JetsonNano环境配置2.1开箱配件介绍2.2烧录系统2.3开机和基本设置2.4开发环境配置2.4.1更新源和软件2.4.2关屏时间设置2.4.3安装中文输入法2.4.4安装CodeOSS2.4.5安装Qt53.项目案例3.1人脸检测3.1.1安装pip3.1.2…

    2022年6月21日
    24
  • 二、第一个java程序:HelloWorld

    二、第一个java程序:HelloWorld前面讲解了java程序的配置,现在要开始进入实例的编程了,第一个程序还是沿用经典的HelloWorld程序进行讲解。一、编程源代码     打开记事本,输入以下代码:publicclassHelloWorld{     //程序的主函数入门     publicstaticvoidmain(Stringargs[])

    2022年5月28日
    37
  • 浏览器出现stack overflow at line:0,解决方法

    浏览器出现stack overflow at line:0,解决方法浏览器如果出现"stackoverflowatline:0"并且有些图片无法显示的问题,是由于注册表被串改了这是由于pngfilt.dll问题,解决方法如下把以下内容保存到记事本,随便起个名字,并且把后缀改名为.reg,双击打开这个reg文件点“是”,添加入注册表中再重启浏览器,问题就解决了WindowsRegistryEditorVersion5.00;…

    2022年7月15日
    20
  • 怎样提高团队管理能力10「建议收藏」

    怎样提高团队管理能力10

    2022年2月6日
    46
  • idea激活码永久有效[最新免费获取]

    (idea激活码永久有效)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月26日
    107
  • android之cannot convert from Fragment1 to Fragment

    在写一个音乐播放器的时候,用到了fragment,结果在需要返回Fragment的方法里面,无法将Fragment1(Fragment的子类)强制转换成Fragment,很是纳闷,我是参照一个开源代码来做的,源码里面很正常,我这里却报错,后来才发现,是对包的导入出现了差错,在Fragment1中导入的是android.app.Fragment而在出错的那个类里面是用android.su

    2022年3月9日
    43

发表回复

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

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