迪杰斯特拉算法.docx

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
迪杰斯特拉算法要点

[日期] 迪杰斯特拉算法 姓名:陈应 学号专业:软件工程 语言:c++ 系统:win8 日期:2014.11.28 指导老师:赵宏宇 实验内容描述:建立字符文件,在文件内输入如下数据: m(为顶点数) i1 j1 k1(i1,j1构成一条边,k1为权重) i2 j2 k2 . . . 利用文件内的数据,使用邻接矩阵,建立又向连通网,采用迪杰斯特拉算法,得到有向连通网单源最短路经。输出指定顶点到其余顶点的最短路径及路径长度。 输入与输出设计: 用标志数组flag[N+1]表示两个集合,当flag[i]=0时表示顶点在集合V-S内,否则在集合S内 为集合S和集合V-S内的每个顶点设置一个距离值,集合S内顶点的距离值就为每个顶点的最短路径,而集合V-S内的顶点距离值为其顶点通过集合S内的顶点到达源点的最短路径 每次从集合V-S中选取距离值最小的顶点,加入到集合S中,此顶点的最短路径即为通过S中的顶点到达源点的最短路径,长度为??的此时的距离值。 每加入一个顶点到S中后,都要调整集合V-S中顶点的距离值 关键数据结构与算法: 邻接表存储网 迪杰斯特拉算法求最短路径 测试与结论 结论:测试正常,符合要求 源代码: #includeiostream #includefstream using namespace std; #define N 20 #define MAX 32767 /*MAX代表无穷大*/ typedef int AdiType; AdiType matrix[N+1][N+1]; //邻接矩阵 typedef struct { int prenode;//表示前点顶点; int pathlength; }shortestPath; shortestPath sp[N+1]; int flag[N+1]={0};//标志数组 /****求源点V到其余顶点的最短路径及长度***/ void dijisktra(int v,int n) { int i,j,m,k,min; flag[v]=1;//源点v进入集合S for(i=1;i=n;i++) { sp[i].pathlength=matrix[v][i];//置距离值 if((sp[i].pathlength!=0)sp[i].pathlength!=MAX) sp[i].prenode=v;//置前点序号 }//初始化路径长度及路径数组sp for(i=1;i=n;i++) { min=MAX; for(j=1;j=n;j++) { if((flag[j]==0)(sp[j].pathlengthmin)) {min=sp[j].pathlength;m=j;}//m点距离值最小 }//从集合V-S中找到距离值最小的点 flag[m]=1;//m点加入集合S for(k=1;k=n;k++) { if(flag[k]==0sp[m].pathlength+matrix[m][k]sp[k].pathlength) { sp[k].pathlength=sp[m].pathlength+matrix[m][k]; sp[k].prenode=m; } }//修改边集数组,调整距离值 } } /*****由前点数组求最短路径****/ void path(int v) { if(!sp[v].prenode)return; path(sp[v].prenode); coutsp[v].prenode-; } int main() { fstream file(D:\\tt.txt); int n,i,j,w,v; filen;//读入顶点数 for(i=1;i=n;i++) for(j=1;j=n;j++) if(i==j ) matrix[i][j]=0; else matrix[i][j]=MAX; while(fileijw) matrix[i][j]=w; cout请输入源点v:;cinv; dijisktra(v,n); cout源点v到各顶点最短路径及路径长度为:endl; for(i=1;i=n;i++) { if(i!=v) { path(i); couti:sp[i].pathlengthendl; } } coutendl; return 0; }

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档