7-1 单源最短路径

本题目要求一有向有权图(以边列表的形式读入),一个起点和一个终点。输出源点到终点的最短路径。

输入格式:

输入三个整数n(100000<n<10000000),s和d,其中n表示边数目,s为起点,d为终点。然后依次输入n条边:v1 v2 w(v1为出度端点,v2为入度端点,w为权值,三者均为非负整数,其中w不超过20,v1和v2不超过1000000且节点序号不一定连续)

输出格式:

一个整数,表示s到d的最短距离。如果不可达,则输出-1.

输入样例:

在这里给出一组输入。例如:

11 0 8
0 1 6
0 2 4
0 3 5
1 4 1
2 4 1
3 5 2
4 6 9
4 7 7
5 7 4
6 8 2
7 8 4

输出样例:

在这里给出相应的输出。例如:

15

因为实验隐藏的测试用例很大,故采用邻接表结构存储边权图;

为了解决内存超限问题,故将数据保存在堆中,即通过new创建数组

为了解决超时问题,故采用了优先队列

段错误可能原因:终点给小了,用例中可能有超过了终点的大小的节点出现

解决办法:直接开一个MAX大小的数组(MAX=1000000),省略不需要的节点信息,例如Path


#include<iostream>
#include<algorithm>
#include<queue>#define MAX 1000000
#define MAXInt 31245
using namespace std;
typedef pair<int,int> Pair;//用优先队列选取权重最小的节点
int arc,s,e;
priority_queue<Pair,vector<Pair>,greater<Pair> >que;typedef struct ArcNode{int adjvex;int weight;struct ArcNode* nextarc;
}ArcNode;
typedef struct VNode{
//  int data;//数组下标即节点名称,不需要data信息bool vis;int wei;
//  int path;//用pair存的值<weight,该权重的节点> ,不需要路径,故path不需要 ArcNode *firstarc;
}VNode;
typedef struct{VNode* vertice;int vexnum,arcnum;
}ALGraph;void Creat(ALGraph &G);
void Dij(ALGraph &G,int s);
int main(){ALGraph G;Creat(G);#if 0 //此处为测试段,测试是否成功创建邻接表for(int i=0;i<MAX;i++){ArcNode* p=G.vertice[i].firstarc;while(p!=NULL){//!p是不正确的 cout<<p->adjvex<<" ";p=p->nextarc;}cout<<endl;}#endif
/*以下为控制结果的输出,若未找到,输出-1*/Dij(G,s);if(G.vertice[e].wei!=MAXInt)cout<<G.vertice[e].wei<<endl;elsecout<<-1<<endl;delete []G.vertice;
}
void Creat(ALGraph &G){cin>>arc>>s>>e;//输入边数,起点,终点 G.vertice=new VNode[MAX];G.arcnum=arc;//G.vexnum=e+1;for(int k=0;k<MAX;k++){G.vertice[k].firstarc=NULL;// G.vertice[k].data=k;G.vertice[k].vis=false;G.vertice[k].wei=MAXInt;//    G.vertice[k].path=-1;}for(int i=0;i<G.arcnum;i++){int v1,v2,wei;cin>>v1>>v2>>wei;ArcNode *pe=new ArcNode;pe->adjvex=v2;pe->weight=wei;pe->nextarc=G.vertice[v1].firstarc;G.vertice[v1].firstarc=pe; }
}
void Dij(ALGraph &G,int s){G.vertice[s].wei=0;//初始化起点weight为0/*错误点1:初始化只需将起点初始化插入队列即可,不需要对起点的邻接点也初始化,
此处操作与循环中操作相同*//*ArcNode *p=G.vertice[s].firstarc;while(p!=NULL){G.vertice[p->adjvex].wei=p->weight;//初始化权重 G.vertice[p->adjvex].path=s;//初始化前驱节点 //    ArcNode *d=p;p=p->nextarc;//   delete d;//释放d所指向的内存 }  */que.push(Pair(0,s));while(!que.empty()){Pair tmp=que.top();que.pop();int v=tmp.second;//节点 int w=tmp.first;//权重 if(G.vertice[v].vis==true)continue;elseG.vertice[v].vis=true;//s已被访问 ArcNode *p=G.vertice[v].firstarc;while(p!=NULL){int v0=p->adjvex;if(w+p->weight<G.vertice[v0].wei&&!G.vertice[v0].vis){G.vertice[v0].wei=G.vertice[v].wei+p->weight;//G.vertice[v0].path=v;//更新前驱节点 que.push(Pair(G.vertice[v0].wei,v0));}p=p->nextarc;//错误点2:p未循环 } }
}

对于上述代码的优化:

1.可以在找到终点时就退出循环,输出结果

2.对于此处的优先队列来说,我以pair(相当于下图的map)为关键字存储,故会存在同一个节点对应不同weight的情况,例如:之前存入了<3,1> (节点1的weight为3),更新之后存入了<2,1>(节点1的权重为2),虽不影响结果,但队列里会有重复的节点,浪费内存

改进:入队前与已在队列里的节点比较weight,小于则修改weight

3、采用链式前向星+优先队列

https://pursuit.blog.csdn.net/article/details/107674290

反思与总结

通过这次实验,让我意识到,从代码思想到代码实现,再到具体的实际应用,这之间都是有距离的。

代码思想到实现:这考验的是个人代码实现水平,把思想变成代码的能力有待加强

代码思想到实际应用:实际应用过程中,由于数据量,时间限制等多方面因素的影响,这就需要改善代码的适应性,结合一些其他的手段以投入实际应用。算法不可能是赤裸裸的直接用的。对于实际问题的处理能力有待增强。

对于迪杰斯特拉算法的学习相关推荐

  1. java迪杰斯特拉算法介绍_178-迪杰斯特拉(Dijkstra)算法基本介绍

    2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...

  2. python做算法分析_Python实现迪杰斯特拉算法过程解析

    一. 迪杰斯特拉算法思想 dijkstra算法主要针对的是有向图的单元最短路径问题,且不能出现权值为负的情况!dijkstra算法类似于贪心算法,其应用根本在于最短路径的最优子结构性质. 最短路径的最 ...

  3. c++ 遍历所有点且距离最短_图解:最短路径之迪杰斯特拉算法

    小禹禹们,你们好,景禹最近已经开学,忙着准备毕业答辩的事情,这才抽身个大家更新文章,还请莫怪.生活实属不易,有时候让人有点儿焦头烂额,甚至想让景禹放弃继续更新文章,可是千百号人默默地关注者景禹,当然也 ...

  4. 最短路径问题(图表详解迪杰斯特拉算法)

    首先,我们来看一下相关的图的一些基本知识点: 图:图 G=(V,E) 由顶点集 V 和边集 E 组成.每条边对应一个点对 (v,w),其中 v,w 属于 V .如果图中的点对是有序的,那么该图就是有向 ...

  5. 校园导游系统_C语言实现_Dijkstra(迪杰斯特拉算法)_数据结构

    西京学院导游系统 摘要   要完成对整个导游图系统的功能实现,需要对每一项功能都有清楚的设想和认识,了解并明确每一项功能的实现和需要解决的问题,选择正确并且高效的算法把问题逐个解决,最终实现程序的正确 ...

  6. 数据结构课设之校园导航系统(迪杰斯特拉算法)

    一.需求分析 介绍学校的主要地点和这些地点的特点,以及从一个地点到达另外一个地点的最短路径. 二.系统设计 1.理论依据 根据设计要求分析校园导航系统的设计要求,掌握设计中所设计到的无向网的建立,遍历 ...

  7. 图的应用---最短路径问题 用迪杰斯特拉算法解决 《地铁换乘问题》

    图的应用-最短路径问题 用迪杰斯特拉算法解决 <地铁换乘问题> 代码是在我学习的过程中完成的,也许会有问题,希望大家批评指正. 题目: 描述:已知2条地铁线路,其中A为环线,B为东西向线路 ...

  8. 迪杰斯特拉算法-西安地铁最短路线问题

    文章说明 图是一种较线性表和树更为复杂的数据结构,在各个领域都有着广泛的应用,如城市交通.电路网络分析.交通灯的设置等,其中,最短路径问题的求解是日常生活中最为常见的问题.在现实生活和生产实践中,有许 ...

  9. 图 相关算法~从头学算法【广搜、 深搜、 拓扑排序、 并查集、 弗洛伊德算法、迪杰斯特拉算法】

    图的相关主流算法主要有: 广度优先搜索 深度优先搜索 拓扑排序 并查集 多源最短路径(弗洛伊德算法) 单源最短路径(迪杰斯特拉算法) 其中呢,最基本的是前两种,也就是平时常用的广搜和深搜,本文中将概要 ...

最新文章

  1. golang微服务框架对比_微服务里程碑,Golang与Spring Cloud Alibaba完美结合
  2. 一个简单程序的反编译
  3. VC++程序开机自启动(注册表上注册)
  4. TF之NN:利用DNN算法(SGD+softmax+cross_entropy)对mnist手写数字图片识别训练集(TF自带函数下载)实现87.4%识别
  5. centos安装jdk7
  6. SpringBoot2.0 以上 WebMvcConfigurerAdapter 方法过时 解决办法
  7. 请领导审阅并提意见应怎么说_职场中,领导不喜欢你,暗中排挤你,怎么办?老员工给你支5招!...
  8. 计算机及相关设备制造业2020,在现实生活中,接近完全垄断市场类型的行业包括()。A.计算机及相关设备制造业B.稀有...
  9. django-正向查询与反向查询演练-查询集的三种状态
  10. Windows 8正式版亮点与新功能抢先看
  11. python retry retrying使用
  12. Dynamics AX2012 Menu Items Type
  13. 在软件测试中UT,IT,ST,UAT分别是什么意思
  14. arcgis超级工具安装教程_ArcGIS超级工具SPTOOLS1.7升级说明
  15. Power BI----各类切片器的使用
  16. Java真的是低糖语言吗?
  17. 李开复--生命是最严厉的导师
  18. 你做过哪些事情让你女朋友感动到哭,这个100%可以做到!
  19. 无人驾驶算法学习(十一):IMU标定及Allan方差分析
  20. 笔记本处理器排名_Intel十代处理器笔记本电脑排行榜 (附带推荐机型信息20191021)...

热门文章

  1. 成绩工资水电费证书等综合查询系统源码
  2. android百度地图画圆,使用百度地图Api,在地图上画圆形区域
  3. turtle实现一团乱麻和甜甜圈
  4. 史上最全的Linux 命令大全
  5. 华为发布FTTR全光家庭星光F30系列新品,点亮家庭数字生活
  6. [附源码]java毕业设计房屋租赁系统
  7. git的使用推送代码到华为云、码云gitee、github
  8. 12V将路由器网口烧了
  9. ColdFusion是什么
  10. DocuWare 文件管理与工作流程自动化案例研究——DocuWare 工作流程功能使在家工作的员工能够保持沟通和高效工作,支持混合环境