此算法没有采用《数据结构C语言版》中的存储结构,而是采用邻接表的方法存储图,经过改进,还能输出最短路径。

"Dijkstra.h"

#include<iostream> using namespace std; #define MAX_VEX_NUM 20 #define INFINITY INT_MAX #define CANTFIND -1 class Path//记录源点到每一个点的路径 { public: Path(); int pathnode; Path *next; }; Path::Path() { pathnode=0; next=NULL; } class NextNode//邻接表存储以某节点为尾的弧的相关信息 { public: NextNode(); int nextvex;//顶点编号 int weight;//弧上的权值 NextNode *next;//下一个节点的指针 }; NextNode::NextNode() { nextvex=weight=0; next=NULL; } class VexNode//顶点相关信息 { public: VexNode(); char name;//顶点名称 bool choose;//标示此节点标示的最短路径是否已经被选择 int dist;//此节点当前存放的最短路径 NextNode *firstnext; Path *path; }; VexNode::VexNode() { choose=false; dist=INFINITY; firstnext=NULL; path=NULL; } class VexBox//顶点集合 { public: VexBox(); int vexnum;//定点数目 VexNode vexbox[MAX_VEX_NUM];//顶点集合 }; VexBox::VexBox() { vexnum=0; } class ShortestPath_DIJ { public: void ShortestPath();//接口函数 private: void GetVex();//得到顶点信息 void GetArc();//得到弧的相关信息 void GetShortestPath();//得到最短路径 void PrintShortestPath();//打印最短路径 int GetShortestNode();//得到dist最小的节点 void UpdatePath(int,int);//更新路径 void ReMove(Path *);//销毁原路径 VexBox v;//顶点集合 int sourse; }; void ShortestPath_DIJ::ShortestPath() { GetVex();//得到顶点信息 GetArc();//得到弧的相关信息 GetShortestPath();//得到最短路径 PrintShortestPath();//打印最短路径 } void ShortestPath_DIJ::GetVex()//得到顶点信息 { cout<<"Please Input The Name Of Each Vertex :"<<endl<<endl; char name; while(cin>>name) { v.vexbox[v.vexnum++].name=name; } cin.clear(); } void ShortestPath_DIJ::GetArc()//得到弧的相关信息 { cout<<"Please Input The Information Of Each Arc :"<<endl <<"tail head weight"<<endl; int tail,head,weight; NextNode *newnode,*p; while(cin>>tail>>head>>weight) { newnode=new NextNode; newnode->nextvex=head; newnode->weight=weight; if((p=v.vexbox[tail].firstnext)==NULL) { v.vexbox[tail].firstnext=newnode; }//if else { while(p->next!=NULL) p=p->next; p->next=newnode; }//else }//while cin.clear(); } int ShortestPath_DIJ::GetShortestNode()//得到dist最小的节点 { int ans=CANTFIND,min=INT_MAX; for(int i=0;i<v.vexnum;i++) { if(v.vexbox[i].choose==false&&v.vexbox[i].dist<min) { min=v.vexbox[i].dist; ans=i; }//if }//for v.vexbox[ans].choose=true;//标记为已选择 return ans; } void ShortestPath_DIJ::ReMove(Path *p)//销毁原路径 { if(p->next!=NULL) ReMove(p->next); delete p; } void ShortestPath_DIJ::UpdatePath(int a,int b)//更新路径 { Path *p,*pt,*newpath; ReMove(v.vexbox[b].path); newpath=new Path; newpath->pathnode=v.vexbox[a].path->pathnode; v.vexbox[b].path=newpath; p=v.vexbox[a].path->next; pt=v.vexbox[b].path; while(p!=NULL) { newpath=new Path; newpath->pathnode=p->pathnode; pt->next=newpath; p=p->next; pt=pt->next; } } void ShortestPath_DIJ::GetShortestPath()//得到最短路径 { Path *newpath,*pt; cout<<"Please Input The Sourse :"<<endl; while(cin>>sourse&&!(sourse<v.vexnum));//得到符合条件的源点 cout<<v.vexbox[sourse].name<<" : Start"<<endl; v.vexbox[sourse].dist=0;//对源点的相关处理 for(int i=0;i<v.vexnum;i++)//初始化路径 { if(i!=sourse) { newpath=new Path; newpath->pathnode=sourse; v.vexbox[i].path=newpath; } } NextNode *p; p=v.vexbox[sourse].firstnext; while(p!=NULL) { newpath=new Path; newpath->pathnode=p->nextvex; v.vexbox[p->nextvex].path->next=newpath; v.vexbox[p->nextvex].dist=p->weight; p=p->next; } int ncase=v.vexnum-1; int node; while(ncase--)//处理源点到其他点的最短路径长度 { node=GetShortestNode();//获得当前情况下未被选择的最短边 if(node==CANTFIND)//控制跳出 break; p=v.vexbox[node].firstnext; while(p!=NULL)//如有必要修改和该顶点相关的节点的Dist值 { if(v.vexbox[node].dist+p->weight<v.vexbox[p->nextvex].dist) { v.vexbox[p->nextvex].dist=v.vexbox[node].dist+p->weight; UpdatePath(node,p->nextvex); newpath=new Path; newpath->pathnode=p->nextvex; pt=v.vexbox[p->nextvex].path; while(pt->next!=NULL) pt=pt->next; pt->next=newpath; } p=p->next; } } } void ShortestPath_DIJ::PrintShortestPath()//打印最短路径 { Path *p; for(int i=0;i<v.vexnum;i++) { if(i!=sourse) { p=v.vexbox[i].path; cout<<v.vexbox[i].name<<" : "; if(v.vexbox[i].dist==INFINITY) cout<<"∞"<<endl; else { cout<<v.vexbox[i].dist<<" Path :";//打印路径 cout<<v.vexbox[p->pathnode].name; p=p->next; while(p!=NULL) { cout<<"->"<<v.vexbox[p->pathnode].name; p=p->next; } cout<<endl; } }//if }//for }

"mian.cpp"

#include"Dijkstra.h" int main() { ShortestPath_DIJ d; d.ShortestPath(); system("pause"); }

数据结构_图_最短路径_狄杰斯特拉(Dijkstra)算法相关推荐

  1. 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)

    目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...

  2. 最短路径之迪杰斯特拉(Dijkstra)算法

    定义 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题.迪杰斯特拉算法 ...

  3. 最短路径:迪杰斯特拉(Dijkstra)算法图解

    Dijkstra算法可以求解带权图中最短路径. 算法思想:将所有节点分为两个区域,已知区域和未知区域.最开始的时候,将起点加入到已知区域,其他点加入未知区域,比较已知区域到未知区域的所有连线,最短的路 ...

  4. 数据结构——图——迪杰斯特拉(Dijkstra )算法

    数据结构--图--迪杰斯特拉(Dijkstra )算法 这是一个按路径长度递增的次序产生最短路径的算法.它的思路大体是这样的. 比如说要求图7-7-3中顶点v0到顶点v1的最短距离,没有比这更简单的了 ...

  5. 图的最短路径之迪杰斯特拉算法和弗洛伊德算法

    文章目录 一.迪杰斯特拉(Dijkstra)算法 1.定义描述 2.算法思想 3.算法步骤 4.算法图解 二.弗洛伊德(Floyd)算法 1.定义描述 2.算法思想 3.算法步骤 三.Dijkstra ...

  6. Java 图的最短路径问题-迪杰斯特拉算法VS弗洛伊德算法

    1.迪杰斯特拉算法VS弗洛伊德算法 迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径: 弗洛伊德算法中每一个顶点都是出发访问点,所以需要将每一个顶点看做被访问顶点,求出从每一 ...

  7. 迪杰斯特拉(Dijkstra)算法解决最短路径问题

    Dijkstra 算法介绍 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.迪杰斯特拉(Dijkstra)算法是最经典的最短路径算法之一,用 ...

  8. 059.迪杰斯特拉(Dijkstra)算法的原理以及解决最短路径问题

    1. 迪杰斯特拉(Dijkstra)算法的原理 1.1. 算法应用场景-最短路径问题 1.2. 基本介绍 1.3. 步骤详解 1.4. 思路解析 1.5. 图解步骤 2. 迪杰斯特拉(Dijkstra ...

  9. java数据结构和算法——迪杰斯特拉(Dijkstra)算法

    目录 一.迪杰斯特拉(Dijkstra)算法介绍 二.迪杰斯特拉(Dijkstra)算法过程 三.迪杰斯特拉(Dijkstra)算法--应用场景(最短路径问题) 四.迪杰斯特拉(Dijkstra)算法 ...

最新文章

  1. 怎样才能高效的在家办公或者远程办公呢?
  2. 请问一个跨进程调用的问题?
  3. biztalk 2010 映射
  4. 【干货】实用案例|产品设计中的恰到好处
  5. Android基本程序单元Activity总结
  6. css布局 右固定,CSS左侧固定右侧自适应的五种布局方法
  7. 【Elasticsearch】使用Elasticsearch 7.8 快速搭建食谱搜索系统
  8. h3c 链路聚合测试_4G/5G聚合路由器在直播中无线多链路聚合图传技术是什么?
  9. IntelliJ IDEA 2019.3 发布,性能和质量居然牛的飞天了!
  10. 16进制发送 mqtt客户端调试工具_MQTT客户端调试工具(MQTT Simulate Device)
  11. Sublime text 3(ST3) - Source Insight
  12. Zabbix监控端口
  13. 关于颜色HSL(色度、饱和度、亮度)
  14. Unity内进行布尔差运算,砍树效果的实现
  15. 50道简单家常菜~~~~~让你得意厨房
  16. 首次沙龙场面火爆,高能分享掌声不断,大咖观点集锦为你总结好了
  17. wcf负责与数据库打交道_与新手打交道时的神话
  18. SMU Problem 1727 逃生
  19. Bottom Tab
  20. Windows中常用文件拷贝工具的评测和对比 1

热门文章

  1. python大小写转换_Python字符串中怎样进行大小字母之间的转换
  2. 火狐FireFox和IE浏览器的title属性文本过长显示不全问题
  3. 智能的下一代数据中心安全
  4. 【Python画图turtle 之】画一个奸笑(滑稽)表情
  5. cocos2d-x 3.2 物理小游戏教程1 block it需求分析
  6. 怎么才能心无旁骛地学习?
  7. iOS中如何实现检测苹果设备的类型
  8. 微信公众号如何发布文章到多个自媒体平台?
  9. hexo排坑——页面跳转变成了下载
  10. 数理方程和连续介质力学 考试复习笔记