最短路径问题主要分为两种,单源和多源。

对于无权的单源最短路径问题,因其所有边长相等,在使用广度优先搜索时距离一定是从0开始依次向外扩展一层,不会突然出现一个顶点使得之前录入的路径缩短。

那么就只需要在广度优先搜索的过程中加入可以记录距离和路径的容器即可。

class unweighted
{
public:vector<vector<int>>map;//邻接矩阵vector<int>dis;//记录距离的容器vector<int>path;//记录路径的容器void creat(){cout << "请输入元素个数:" << endl;int num;cin >> num;map.resize(num);dis.resize(num);path.resize(num);for (int i = 0; i < num; i++){map[i].resize(num);}for (int i = 0; i < num; i++){for (int j = 0; j < num; j++){if (i == j)map[i][j] = 0;elsemap[i][j] = -1;}}cout << "请输入数据个数:" << endl;int row;cin >> row;int number = 0;while (number < row){int begin;int end;cin >> begin >> end;map[begin - 1][end - 1] = 1;//数据存储以下标0为起点,而我们的输入以1为起点number++;}}void Unweighted(){cout << "请输入源点:" << endl;int v;cin >> v;v--;dis.assign(dis.size(),-1);//距离容器中除了源点本身,其他顶点初始化为-1dis[v] = 0;path.assign(path.size(), -1);//路径全部初始化为-1queue<int>q;//用队列进行广度优先搜索q.push(v);while (!q.empty()){int w = q.front();//删掉队列头部顶点并把该顶点的未被访问过的邻接点放入队列q.pop();for (unsigned int i = 0; i < map.size(); i++){if (map[w][i] == 1 && dis[i] == -1)//dis[i]为-1说明未被访问{dis[i] = dis[w] + 1;path[i] = w + 1;q.push(i);}}}}
};

对于有权的单源最短路径,使用Dijkstra算法,为了保证每次录入的顶点一定是最短路径经过的顶点,我们需要引入贪心算法,即每次从可访问的顶点中挑一个距离最小的,当然此时距离容器中非邻接点将被初始化为正无穷以保证距离最小的顶点可以成功被挑选出来,这时这个距离最小的顶点也一定是已访问顶点的邻接点

class dijkstra
{
public:vector<vector<int>>map;vector<int>dis;vector<int>path;void creat(){cout << "请输入元素个数" << endl;int num;cin >> num;map.resize(num);dis.resize(num);path.resize(num);for (int i = 0; i < num; i++){map[i].resize(num);dis[i] = INF;}for (int i = 0; i < num; i++){for (int j = 0; j < num; j++){if (i == j)map[i][j] = 0;elsemap[i][j] = INF;//这时需要将距离初始化为正无穷}}cout << "请输入数据数量:" << endl;int row;cin >> row;int number = 0;while (number < row){int begin;int end;int side;cin >> begin >> end >> side;map[begin - 1][end - 1] = side;number++;}}void Dijkstra(){cout << "请输入源点" << endl;int v;cin >> v;v--;for (unsigned int i = 0; i < map.size(); i++){dis[i] = map[v][i];if (map[v][i] == INF || i==0)//将源点的非邻接点路径初始化为-1path[i] = -1;elsepath[i] = v + 1;//将源点的邻接点路径初始化为源点}vector<bool>collected;//用这个容器记录已访问的顶点collected.assign(map.size(), false);collected[0] = true;while (1){int V = 0;//用V记录dis中最小元素的下标bool check = true;//用这个判断collected中元素是否都已被访问过int min = INF;//用这个记录当前最小元素for (unsigned int i = 0; i < map.size(); i++){if (collected[i] == true)continue;if (min > dis[i]){min = dis[i];V = i;check = false;}}if (check == true)break;collected[V] = true;//将挑选的元素标记为已访问for (unsigned int i = 0; i < map.size(); i++){if (collected[i] == false)//对所有未被访问的V的邻接点计算距离{它们之间的if(dis[V] + map[V][i] < dis[i])//如果V的邻接点的距离比V的距离加边的长度要长,更新邻接点的距离,并更新路径{dis[i] = dis[V] + map[V][i];path[i] = V + 1;}}}}}
};

对于有权的多源最短路径,当然可以对每个顶点做一遍Dijkstra算法,但有更聪明的Floyd算法,对于一条路径来说,如果有一个路径外的顶点,使得经过该点的路径的距离比之前的要短,那么新的路径就是更短的路径,如此反复就会得到最短的路径。

class floyd
{
public:vector<vector<int>>map;vector<vector<int>>dis;void creat(){cout << "请输入元素个数:" << endl;int num;cin >> num;map.resize(num);dis.resize(num);for (int i = 0; i < num; i++){map[i].resize(num);dis[i].resize(num);}for (int i = 0; i < num; i++){for (int j = 0; j < num; j++){if (i == j)map[i][j] = 0;elsemap[i][j] = INF;dis[i][j] = -1;}}cout << "请输入要输入的数据数量:" << endl;int row;cin >> row;int number = 0;while (number < row){int begin;int end;int side;cin >> begin >> end >> side;map[begin - 1][end - 1] = side;dis[begin - 1][end - 1] = begin;number++;}}void Floyd(){for (unsigned int k = 0; k < map.size(); k++)//对每个顶点做一遍算法{for (unsigned int i = 0; i < map.size(); i++)//起点{for (unsigned int j = 0; j < map.size(); j++)//终点{if (map[i][j] > map[i][k] + map[k][j]){map[i][j] = map[i][k] + map[k][j];dis[i][j] = k + 1;}}}}}
};

图的最短路径问题(C++)相关推荐

  1. 沃舍尔算法_[数据结构拾遗]图的最短路径算法

    前言 本专题旨在快速了解常见的数据结构和算法. 在需要使用到相应算法时,能够帮助你回忆出常用的实现方案并且知晓其优缺点和适用环境.并不涉及十分具体的实现细节描述. 图的最短路径算法 最短路径问题是图论 ...

  2. c++ 遍历所有点且距离最短_C/C++ 图的最短路径 Dijkstra 算法

    作者:小石王 链接:https://www.cnblogs.com/xiaoshiwang/p/9442391.html 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最 ...

  3. 数据结构最短路径例题_数据结构算法实验8图的最短路径问题附源代码.doc

    浙江大学城市学院实验报告 课程名称 数据结构与算法 实验项目名称 实验八 图的最短路径问题 实验成绩 指导老师(签名 ) 日期 实验目的和要求 掌握图的最短路径概念. 理解并能实现求最短路径的DijK ...

  4. python棋盘最短路径_Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例...

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  5. java无权图求最短路径_求有权图和无权图的最短路径

    无权图的最短路径 思路:无权图的最短路径也就是要求两点之间最少几跳可达,那么我们可以这样,用广度遍历,从起点开始一层层遍历,如果第一次遍历到终点,那么肯定是最短路径. public static vo ...

  6. 带权图的最短路径算法(Dijkstra)实现

    一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...

  7. 【数据结构】图(最短路径Dijkstra算法)的JAVA代码实现

    最短路径的概念 最短路径的问题是比较典型的应用问题.在图中,确定了起始点和终点之后,一般情况下都可以有很多条路径来连接两者.而边或弧的权值最小的那一条路径就称为两点之间的最短路径,路径上的第一个顶点为 ...

  8. 数据结构实验头歌 第1关:求图的最短路径

    任务描述 本关任务:编程实现求图的最短路径 相关知识 最短路径的Dijkstra算法: 求最短路径就是求图中的每一个点到图中某一个给定点(认为编号为0的点)的最短距离. 具体算法就是初始有一个旧图,一 ...

  9. 网状结构(图)图的存储(邻接矩阵、邻接表)、图的遍历(深度DFS、广度BFS)、图的最短路径

    图 多对多关系 是一种网状数据结构,图是由非空的顶点集合和一个描述顶点之间关系的集合组成 其定义 Graph = (V, E) V={x | x ∈某个数据对象} E = {<u, v> ...

  10. 算法-动态规划2图问题-多段图的最短路径问题

    算法-动态规划2-多段图的最短路径问题 多段图的最短路径问题 问题:设图G=(V,E)是一个带权有向图,如果把顶点集合V划分成k个互不相交的子集Vi(2<=k<=n,1<=i< ...

最新文章

  1. 防止标题或者特定内容长度溢出wordcut
  2. 深度学习12大常见问题解答(附答案)
  3. cropped-img_2692.jpg
  4. How does “Coded UI test” finds a control ?
  5. ASP.NET AJAX深入浅出系列课程
  6. mysql errmsg unknown_详解MySQL Server 启动时出现bug的解决方法
  7. python 接口测试 url_Python 接口测试之接口请求方法封装
  8. Synchronous Bidirectional Inference for Neural Sequence Generation
  9. python生成api文档_文档API生成工具
  10. matlab 生成gcode文件,解析gcode文件以提取坐标
  11. chrome 如何官网下载谷歌浏览器离线安装包
  12. 详细讲解Socket服务器与多客户端的长链接通信(含Demo)
  13. 国家各个政府机构网站
  14. 计算机中的相对符号怎么按,丶符号怎么打-Mac里特殊符号的输入技巧
  15. ..\target\m2e-wtp\web-resources\META-INF\MANIFEST.MF (系统找不到指定的路径)解决办法
  16. C++之enum与switch
  17. 1.1 Linux内核代码下载、编译
  18. centos-sftp
  19. 《天池精准医疗大赛-人工智能辅助糖尿病遗传风险预测》模型复现和数据挖掘-论文_企业
  20. Windows 解除文件被占用

热门文章

  1. C# 及excel中【总体方差】、【样本方差】的计算公式
  2. win10电脑用蓝牙实现文件传输,安卓手机通过蓝牙将文件传送到电脑
  3. 自媒体运营中千万不能做的四件事情
  4. 从零学Java(17)之字符串连接,你要成为小学生之友吗?
  5. 管理类联考-英语: 前导( 一 )
  6. 高一计算机专业学期总结,高一计算机学期工作总结
  7. 临河三中宏志班2021年高考成绩查询,内蒙古巴彦淖尔市临河三中2018-2019高一下学期第二次月考(宏志)生物试卷 Word版含答案.doc...
  8. python的flask框架实现的小型二手商城
  9. 大数据技术原理与应用 第一篇 大数据基础
  10. 大数据营销模型思路架构