迪杰斯特拉算法C语言实现

/*迪杰斯特拉算法算法步骤:

(1)初始时,S只包含源点。

(2)从U中选取一个距离v最小的顶点k加入S中(该选定的距离就是v到k的最短路径长度)。

(3)以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u(u U)的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。

(4)重复步骤(2)和(3)直到所有顶点都包含在S中。

*/

#include

#include

#include

#define M 999

void main(){

int cost[6][6]={

{M,M,10,M,30,100},

{M,M,M, M, M,M },

{M,5,M, 50,M,M },

{M,M,M, M, M,10 },

{M,M,M, 20,M,60 },

{M,M,M, M, M,M }

};

typedef struct edge{

int adjvex; //边的一个顶点

int cost; //权值

}edge;

int total=0; //计数变量,计算共选择节点多少个

int adjvex[6];//保存依次被选中的节点

edge lowpathcost[6];//初始值为矩阵的第一行。

char path[6][10]={"0","","","","",""};//以0为初始节点开始计算最短路径 (路径)

for(int i=1;i

{ lowpathcost[i].cost=cost[0][i];//初始化为M,最短路径长度为矩阵的第一行权值

if(cost[0][i]!=M)

{

lowpathcost[i].adjvex=0;//有数据则adjvex置为0

cout

}

}

int min;//保存最小权值

int minvex;//保存最小权值边的另一顶点

int selected[6]={0};//次变量是作为控制已输出的节点不再参与的判断参数

cout

for(int num=1;num

{

min=M;

for(i=1;i

if(min>lowpathcost[i].cost&&!selected[i])

{

min=lowpathcost[i].cost;//第一次查找为10 即第一行中最小的值

minvex=i;//此时i=2

}

adjvex[++total]=minvex;//此时adjvex[1]为2,存放依次选出的顶点

//adjvex[2]=1

if(min!=M)

{

cout

}

selected[minvex]=1; //已参与的节点就置为1

for(i=0;i

if(!selected[i] && lowpathcost[i].cost>min+cost[minvex][i] && min+cost[minvex][i]

{

lowpathcost[i].cost=min+cost[minvex][i];

lowpathcost[i].adjvex=minvex;

}

}

for(i=1;i

cout

cout

int eadjvex,sadjvex;

char ep[2];

for(i=1;i

{

eadjvex=adjvex[i];

sadjvex=lowpathcost[eadjvex].adjvex;

ep[0]='0'+eadjvex; ep[1]='\0';

char tmp[10];

strcpy(tmp,path[sadjvex]);

strcpy(path[eadjvex],strcat(tmp,ep));// path[e]=sp+ep;

cout

athcost[eadjvex].cost

}

}

/*迪杰斯特拉算法算法步骤:

(1)初始时,S只包含源点。

(2)从U中选取一个距离v最小的顶点k加入S中(该选定的距离就是v到k的最短路径长度)。

(3)以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u(u U)的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。

(4)重复步骤(2)和(3)直到所有顶点都包含在S中。

*/

#include

#include

#include

#define M 999

void main(){

int cost[6][6]={

{M,M,10,M,30,100},

{M,M,M, M, M,M },

{M,5,M, 50,M,M },

{M,M,M, M, M,10 },

{M,M,M, 20,M,60 },

{M,M,M, M, M,M }

};

typedef struct edge{

int adjvex; //边的一个顶点

int cost; //权值

}edge;

int total=0; //计数变量,计算共选择节点多少个

int adjvex[6];//保存依次被选中的节点

edge lowpathcost[6];//初始值为矩阵的第一行。

char path[6][10]={"0","","","","",""};//以0为初始节点开始计算最短路径 (路径)

for(int i=1;i

{ lowpathcost[i].cost=cost[0][i];//初始化为M,最短路径长度为矩阵的第一行权值

if(cost[0][i]!=M)

{

lowpathcost[i].adjvex=0;//有数据则adjvex置为0

cout

}

}

int min;//保存最小权值

int minvex;//保存最小权值边的另一顶点

int selected[6]={0};//次变量是作为控制已输出的节点不再参与的判断参数

cout

for(int num=1;num

{

min=M;

for(i=1;i

if(min>lowpathcost[i].cost&&!selected[i])

{

min=lowpathcost[i].cost;//第一次查找为10 即第一行中最小的值

minvex=i;//此时i=2

}

adjvex[++total]=minvex;//此时adjvex[1]为2,存放依次选出的顶点

//adjvex[2]=1

if(min!=M)

{

cout

}

selected[minvex]=1; //已参与的节点就置为1

for(i=0;i

if(!selected[i] && lowpathcost[i].cost>min+cost[minvex][i] && min+cost[minvex][i]

{

lowpathcost[i].cost=min+cost[minvex][i];

lowpathcost[i].adjvex=minvex;

}

}

for(i=1;i

cout

cout

int eadjvex,sadjvex;

char ep[2];

for(i=1;i

{

eadjvex=adjvex[i];

sadjvex=lowpathcost[eadjvex].adjvex;

ep[0]='0'+eadjvex; ep[1]='\0';

char tmp[10];

strcpy(tmp,path[sadjvex]);

strcpy(path[eadjvex],strcat(tmp,ep));// path[e]=sp+ep;

cout

athcost[eadjvex].cost

}

}


相关内容

  • 校园导航系统课程设计
  • 校园导航 课 程设 计报 专 业:计算机科学与技术 课程设计名称:<数据结构课程设计> 题 目:校园导航问题 班 级: 学 号: 姓 名: 同 组 人 员: 指 导 老 师: 完 成 时 间:2012年2月17日 告书 摘要 校园导航问题是基于校园中的不同的景点,从陌生人的角度,为来往的 ...

  • 最小生成树and最短路径
  • 最小生成树and 最短路径 无独有偶,在两个学期的期末中两门不同的科目<离散数学>和<数据结构>中都谈到了图及其衍生的最小生成树.最短路径问题,并给出了相应的算法--克鲁斯卡尔.普林.迪杰斯特拉.沃舍尔算法.这无疑是释放了一个很大的信号--这些内容很重要.由于之前学<离 ...

  • 校园导游实验报告
  • 一:设计目的 1.进一步掌握图的存储,建立和遍历. 2.掌握弗洛伊德算法和迪杰斯特拉算法完成最短路径的有关问题. 3.文件的读写操作的练习与使用. 4.提供校园导游的实用地图. 二. 设计内容 1.以图中顶点表示校园内各景点,存放景点名称.代号.简介等信息:以边表示路径,存放路径长度等相关信息. 2 ...

  • [数据结构]教学大纲
  • <数据结构>教学大纲 Data Structure 课程编号:J6110G0003 课程性质:学科基础课程 适用专业:计算机科学与技术.网络工程.数字媒体技术 先行课:计算机科学导论.离散数学.高级语言程序设计: 后续课:无 . 学分数:5 主讲教师:任燕.王命延.冯豫华.周石林.王玮立 ...

  • 最短路径算法与物流客户运输
  • 最短路径算法与物流客户运输 [摘要]:近年来,随着交通系统的建设和我国物流事业迅速发展.一个信息化.自动化.一体化的物理信息系统已是势在必行.它带给企业的不单单是便捷,还有巨大的经济利益.为了解决运输货物中最佳路径及方式的选择. [关键词]:最短路径:福劳德(Floyd)算法:迪杰斯特拉(Dijks ...

  • 数学史常识(数学大事年表及数学史上的三次危机)
  • 数学史上发生的大事 数学发展至今,不知道经历了多少人的呕心沥血,现在把数学历史上发生的大事的年表列出: 数学大事年表: 推荐约公元前3000年 埃及象形数字 公元前2400-前1600年 早期巴比伦泥版楔形文字,采用60进位值制记数法.已知勾股定理 公元前1850-前1650年 埃及纸草书(莫斯科纸 ...

  • 项目思路:仓库管理机器人系统开发
  • 项目思路:仓库管理机器人系统开发(原创) 在传统仓库管理模式中,由人工在成千上万的货品中挑选出所需零部件送给中控台的方式费时.费力,显然已不符合信息化.现代化的发展要求.目前,越来越多的仓库采用了智能化的管理,如下图.但购买一套仓库管理机器人也耗资不菲.本项目旨在开发一套具有自主知识产权的仓库管理机 ...

  • 银行家算法课程设计
  • 武汉工程大学 计算机科学与工程学院 综合设计报告 设计名称: 操作系统综合设计 设计题目: 进程死锁 学生学号: 专业班级: 学生姓名: 学生成绩: 指导教师(职称): 张立(讲师) 完成时间:至 武汉工程大学计算机科学与工程学院 制 说明: 1.报告中的第一.二.三项由指导教师在综合设计开始前填写 ...

  • 2010深圳大学专插本计算机科学与技术专业试题
  • 2010年深大计算机组成原理(回忆版) 一. 填空题(10个空) 1.组成计算机的5个组成基本部件: 2.主储存器的三个主要性能指标: 3.浮点数加减运算的五个步骤: 4.三级存储器结构: 5.DMA三种工作方式: 6.五种数据传送控制方式: 小结A:以上从我脑海挖出大概,希望对大家有帮助.还有感觉 ...