邮递员算法问题之c++实现

article/2025/10/8 7:29:09

在这里插入图片描述

目录

      • 前言
      • 演示
      • 问题介绍
      • 思路
      • 代码复现
      • 尾言

前言

大家好,我是Ericam_。
近些时间,通过一个项目接触到了邮递员算法问题,还是挺有意思的(虽然做起来经历了不少的困难)。最后勉强复现了吧,写个文章就当记录一下。

演示

在这里插入图片描述

问题介绍

1962年有管梅谷先生提出中国邮递员问题(简称CPP)。一个邮递员从邮局出发,要走完他所管辖的每一条街道,可重复走一条街道,然后返回邮局。任何选择一条尽可能短的路线。

当邮递员可以每条道路仅走一次便返回起点,那该路线一定是最短的。而欧拉回路恰巧满足这种条件。那什么才是欧拉回图呢?

什么是欧拉回图?

欧拉回图:每个点的入度和出度必须相等(起始点也一样),也就是说,每个节点的度应该是偶数个。

在这里插入图片描述
但在实际生活中,基本上这种特殊情况是不存在的,所以我们想要解决邮递员问题,首要便是要构造欧拉回图,只要能够花费最小的代价来构造欧拉回图,那么邮递员问题便得到解决了。

所以首先我们要找到图中所有的奇度点,(奇度点个数一定是偶数个,这里就不证明了),当奇度点两两相连后,找到耗费最少的一组组合即可。

思路

以下给出我个人的思路,如有疏漏,请多包涵🤭~

  1. 首先我们需要找到图中所有的奇度点
  2. 接下来我们需要比较路径长度。由于图一定是连通图,所以每两个点之间都会存在直接或间接的路径,但两个点之间可能存在多条路径,所以我们需要先求出点与点之间的最短路径。由于是多源最短路径求解,所以需要使用Floyd算法来解决问题。
  3. 接下来将奇度点两两分组,计算路径长度,然后挑选耗费最少的一个分组。
  4. 构建欧拉回图,解决问题~

代码复现

由于其他原因,不会公开源代码。但可以分享关键操作~

1.首先如何计算出奇度点?

'''
遍历邻接矩阵,挑选出度数为奇数的点即可。用vector来存放顶点序号。
'''

2.Floyd最短路径求解

常规的Floyd算法求解,利用path来存放中介点,方便回溯路径。

//Floyd最短路径计算函数
void MGraph::Floyd(){//更新disfor(int i=0;i<this->n;i++)for(int j=0;j<this->n;j++)if(this->edges[i][j]!=-1){this->dis[i][j] = this->edges[i][j];this->path[i][j] = -1;}for(int k=0;k<this->n;k++)for(int i=0;i<this->n;i++)for(int j=0;j<this->n;j++)if(this->dis[i][k]+this->dis[k][j]<this->dis[i][j]){this->dis[i][j] = this->dis[i][k]+this->dis[k][j];this->path[i][j] = k;}
}

3 . 通过DFS来分组,寻找耗费最小的组合。(难点)

这里是我觉得最难的一点,同样我的方法也不够好。之后想过很多改进,但甚至不如原方法…
个人思路:

利用vector v来存放点,每次挑选两个点作为一组存入,当v中点个数等于奇度点个数时,一个组合便完成了,计算v中每个组的两个点的路径长度并求和,然后判断是否最小。

//组合(输出所有奇数点的排列组合)
void MGraph::DFS(vector<int>v){//组合完成if(v.size()==this->odd_vex.size()){float sum=0.0;for(int i=0;i<v.size();i+=2){sum += this->dis[v[i]][v[i+1]];}if(sum<this->min_addDis){this->mindis_oddvex = v;this->min_addDis = sum;}return;}for(int i=0;i<this->odd_vex.size()-1;i++){//如果v中已存在节点iif(this->exists(v,this->odd_vex[i]))continue;for(int j=i+1;j<this->odd_vex.size();j++){//如果v中已存在节点jif(this->exists(v,this->odd_vex[j]))continue;vector<int>new_v(v);new_v.push_back(this->odd_vex[i]);new_v.push_back(this->odd_vex[j]);this->DFS(new_v);}}
}

4 .求邮递员行走路线

这里就如同迷宫问题一样,往前走即可,走过去便删除走过的边(某些边可能存在多条)。

//求欧拉路径
void MGraph::getEulerpath(int v){for(int i=0;i<this->n;i++){if(this->edges_num[v][i]>0){this->edges_num[v][i]--;this->edges_num[i][v]--;this->euler_path.push(i);//当欧拉路径中顶点个数等于图总边数+1(因为返回起点),寻找完成if(this->euler_path.size() == this->e+1){this->finish_eulerpath = 1;return;}getEulerpath(i);if(this->finish_eulerpath)return;this->euler_path.pop();this->edges_num[v][i]++;this->edges_num[i][v]++;}}
}

尾言

感谢您的阅读,如有问题可私信,有偿代写代码~
最后如果本篇文章对您有帮助,恳求一键三连/(ㄒoㄒ)/~~!!!
再不济,点个赞吧 φ(* ̄0 ̄)

在这里插入图片描述


http://chatgpt.dhexx.cn/article/Zo6InYAI.shtml

相关文章

中国邮递员问题+代码实现(cpp)

中国邮递员问题是一个和旅行商问题比较相关但又不太相同的一个问题&#xff0c;而且个人感觉理解的难度更大一点&#xff0c;当然&#xff0c;这就是仁者见仁&#xff0c;智者见智了&#xff0c;旅行商问题是不能回头的&#xff0c;一个节点访问过了不能回来了&#xff0c;并不…

离散数学实验----中国邮递员问题

实验目的和要求 实验目的&#xff1a; 理解什么是欧拉图&#xff0c;熟悉欧拉路和欧拉回路的概念。掌握Dijkstra算法&#xff0c;求解最短路径掌握Fleury算法&#xff0c;求解欧拉回路。了解Edmonds-Johnson算法解决中国邮递员问题的基本思路。通过程序实现中国邮递员问题&…

数据结构——中国邮递员问题

问题描述 代码 #include <stdio.h> #include <stdlib.h> #include <string.h>#define min(a,b) ( (a) < (b) ? (a) : (b) ) #define MAX_NODE 100 #define MAX_EDGE 100 #define INF 0x7fffffff // 表示两点不连通typedef struct {int number; …

[算法导论] 邮递员问题

邮递员问题 旅行商问题&#xff1a;给定一系列城市和每对城市之间的距离&#xff0c;求解访问每一座城市一次并回到起始城市的最短回路。&#xff08;遍历点&#xff0c;回到起点&#xff09; 哈密顿路径 哈密顿图 中国邮递员问题&#xff1a;邮差要设法找到一条最短路径&…

中国邮递员问题的深入剖析与算法实现(附例题及MATLAB、LINGO代码)

中国邮递员问题的深入剖析与算法实现 一、研究背景1.1 哥尼斯堡七桥问题1.2 欧拉图1.3 中国邮递员问题 二、中国邮递员问题深入解读2.1 问题重述2.2 奇偶点图上作业法[^1]2.3 最小二分匹配法1) 针对无向图2) 针对有向图 2.4 $fleury$算法 三、经典中国邮递员问题的具体实现3.1 …

中国邮路算法(中国邮递员问题)(详细)

通路&#xff1a;在无向图中由点边交替组成的序列就是通路&#xff08;如果这个图是简单的&#xff0c;那么也可以使用点的序列来表示&#xff09;&#xff0c;如果首尾的点相同&#xff0c;则称为一条回路 无向图的连通性&#xff1a;无向图中任意一对点之间均有通路 欧拉通路…

那些有趣的网站

之前分享过那些有意思的网站 &#xff0c;这里继续分享一波&#xff0c;也许你用得上。 福利单词 一边背单词一边看妹子的网站&#xff0c;用电脑打开&#xff0c;配合ctrlw 关闭新窗口&#xff0c;不知不觉就背了百来个词了 https://easychen.gitee.io/foxdict/ 工资计算器 简…

常用又有趣的网站大合集

〇、【Python challenge】通关代码及攻略 一、PIECES 拼图 PIECES 拼图网站用 30 个 CSS 碎片进行拼图&#xff0c;向我们呈现了 30 种濒临灭绝的动物。 二、小甲鱼编程学习工作室 包含了各种编程语言学习以及计算机基本操作的教学与奇技淫巧 三、Wolfram Alpha 这是由Wol…

超酷的13个CSS有趣学习网站

13个CSS有趣学习网站 今天来给大家推荐13个辅助你学习巩固知识的网站&#xff0c;让你边玩边学边记&#xff01; 因为这些网站大多都是国外的大佬们做的&#xff0c;所以网页大多都是英文&#xff0c;为了更好地使用&#xff0c;给你们推荐两个翻译的方式&#xff1a; 使用C…

电脑技巧:盘点10个非常实用且有趣的网站

目录 1、聆听大海的声音 2、在线生成Logo 3、今日热榜 4、十万个为什么&#xff08;大人版&#xff09; 5、视频创作导航 6、改图鸭 7、好看电影推荐 8、童年游戏合集 9、各种沙雕表情包 10、反向词典 今天给大家分享10个非常实用且有趣的网站&#xff0c;值得收藏&a…

科普:如何找到有趣的网站?

原址&#xff1a;http://shedingkong.lofter.com/post/302b9d_1943cf2# 其实我发各种网站的推荐&#xff0c;是为了给自己留用&#xff0c;也是因为现在的审查环境下&#xff0c;各种下载资源的分享十分痛苦。总有人问我怎么知道这么多网站&#xff0c;这里来介绍几种方法。 方…

你是否看到过如此有趣的AI网站?

1、营销文案&#xff1a;CopyAI: Create Marketing Copy In Seconds 2、美化ppt设计&#xff1a;https://www.beautiful.ai/ 3、图片修改&#xff1a;https://hotpot.ai 4、照片变视频&#xff1a;https://www.myheritage.com/deep-nostalgia 美化头像&#xff1a;Free Profil…

有趣好玩的python编程网站

✅作者简介&#xff1a;大家好我是hacker707,大家可以叫我hacker &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;python &#x1f4ac;推荐一款模拟面试、刷题神器&#x1f449;点击跳转进入网站 整理了一些非常有意思&#xff0c;适…

有趣的表白网站

今天看到一个傻瓜式的表白网址生成网站&#xff0c;觉得还挺有意思的&#xff0c;所以来分享一下。http://www.51bbw.cn/show/ 进入网址就会看到下面的界面&#xff1a; 然后就可以“量力而行”了&#xff0c;依据财力选择你想制作的模板&#xff0c;老白嫖怪一眼看中了“免费…

有趣的网站

黑客帝国文字雨生成器 AirPano 足不出户的旅行 创客贴 自媒体制图神器

实时查看Starlink在轨卫星、地面站数目和分布情况的有趣网站

记录一些SpaceX的Starlink相关的一些有趣有用小网站~ 一、实时查看Starlink在轨卫星数目和分布情况 https://satellitemap.space/ 除了可以看Starlink的&#xff0c;还可以看OneWeb和GPS的在轨卫星和分布情况&#xff1b; 截止到2022-4-23&#xff0c;共有卫星2283颗&#xf…

收藏全球最有趣的网站 (上)

在线玩转指尖陀螺-FFFFidget ←点击评分&#xff0c;有趣指数&#xff1a; 3.40星 风靡全球的指间小玩具&#xff01;网站可以在线体验指尖陀螺的迷之旋转&#xff0c;同时支持PC和移动端&#xff0c;手机玩起来更带感&#xff01; 传送门 http://ffffidget.com/ 继续阅读 →…

几个有创意有趣的网站推荐

几个有趣的网站推荐&#xff0c;这些网站很有创意&#xff0c;第一眼就很惊艳 都能打开&#xff0c;不过速度有点慢&#xff0c;一定要有耐心等待&#xff0c;因为有几个是国外的网站&#xff0c;如果是在手机上打开的&#xff0c;复制地址进浏览器 1、Marco Gomez &#xff0d…

记录一些有趣网站

https://css-tricks.com/ 2018.01.15更 腾讯游戏官方设计团队 http://tgideas.qq.com/?ADTAGmedia.gameweb.console 2018.01.16更 该文档库&#xff1a;http://tgideas.qq.com/doc/ 里面有个相关的一些干货 王者荣耀网站帮助管理平台 https://pvp.qq.com…

一个神奇的资源网站「有趣网站收藏家」共有186个站点资源-北忘山修改版

一个神奇的资源网站「有趣网站收藏家」共有186个站点资源-北忘山修改版 网站介绍 这个网站有点东西&#xff0c;目前收集了186个资源&#xff0c;小北当时拔下来之后发现都是作者纯html手写的&#xff0c;意思就是每每添加网站都是手动添加上去。小北整下来之后&#xff0c;做了…