课程设计 单源点最短路径算法的实现

课程设计   单源点最短路径算法的实现
课程设计   单源点最短路径算法的实现

数据结构课程设计

设计说明书

单源点最短路径算法的实现

学生姓名

学号

班级

成绩

指导教师

数学与计算机科学学院

2015年 1 月 2 日

数据结构课程设计评阅书

课程设计任务书

2014—2015学年第1学期

专业:学号:姓名:

课程设计名称:数据结构课程设计

设计题目:单源点最短路径算法的实现

完成期限:自 2014 年 12 月 22 日至 2015 年 1 月 2 日共 2 周

设计内容及要求:

最短路径问题已经被应用到GIS、GPS等信息管理系统中,为人们生活带来了很大便利。它属于图结构问题,其解决方法也有不少(如Dijkstra、A-star)。单源点最短路径问题解决的是既定起点的情况下,寻求该点到图中其它顶点的最短路径。请用C/C++语言的结构体、指针、数据结构等基础知识,编写程序实现图的结构定义、图的存储,以及求解单源点最短路径。

设计过程以及写作要求如下:

(1)要针对本题目,认真研究所设计的内容,用简明扼要的语言描述课题,给出课题的基本内容及要求;

(2)根据数据结构的相关知识给出实现建立任意m个顶点n条边的图算法、按照用户给定的源点和目标点,求出它们间的最短路径(打印出来)算法的基本策略及思路;

(3)给出较为详尽数据结构与算法,算法可以用流程图、伪代码等描述手段进行描述;

(4)给出一个完整的算法实现的C/C++程序,算法中的各子算法要力求用函数来实现;

(5)对编写的程序要进行详尽的测试分析;

(6)对本课题的设计工作要进行一个完整深刻的总结。

最终设计成果形式为:

1、设计软件一套;

2、撰写一份课程设计说明书一份,打印并装订成册。

指导教师(签字):教研室主任(签字):

批准日期:年月日

摘要

本系统以VC++作为软件开发环境,C语言作为程序开发语言,邻接矩阵作为存储结构,设计与实现了最短路径运算。该系统实现了有向图的存储、最短路径的运算等主要功能。依照该系统可以解决生活中许多问题,比如交通路线的选择,工程时间的预算等等,让人们可以做出合理的选择。本系统通过分析课题的背景、意义、要求,分别从课题描述、逻辑设计、算法设计、调试与测试等各个方面详细介绍了系统的设计与实现过程,最后对系统的完成情况进行了总结。界面清晰,操作简单,易于用户接受。

关键词:VC++;邻接矩阵; 最短路径

目录

1课题描述 (1)

2 问题分析与任务定义 (2)

2.1问题分析 (2)

2.2任务定义 (2)

3 算法设计 (3)

3.1 图的邻接矩阵的存储结构 (3)

3.2 Dijkstra算法思想 (4)

4 系统逻辑设计 (5)

4.1 主函数流程图如图4.1所示 (5)

4.2 Create函数流程图如图4.2所示 (6)

4.3 Dijkstra函数流程图如图4.3所示 (8)

5 源代码 (11)

6 调试与测试 (14)

6.1合法数据输入 (14)

6.2非法数据输入 (15)

总结 (16)

参考文献 (17)

1课题描述

乘车旅行的人大多数都希望找出到目的地尽可能短,花费少的行程,那么如何找出从出发点到目的地的最短路径?由于路径比较多,所以用手工计算起来比较复杂,抽象,因此人们用计算机语言代替手工计算来求得最短路径。而在计算机语言中迪杰斯拉算法比较常用,简捷,故人们经常借助计算机程序用迪杰斯拉算法求得单源点的最短路径,这样可以广泛的提高效率,而且条理清晰,通俗易懂。

2 问题分析与任务定义

2.1问题分析

本系统是要解决的是单源点最短路径问题,设计程序,实现最短路径的求法,系统需要达到的主要功能如下:

(1) 编写算法能够建立带权图,并能够用Dijkstra算法求该图的最短路径。

(2) 能够选择图上的任意一顶点做为开始节点。最短路径输出不必采用图形方式,可顶点序列方式输出。

(3) 根据课设题目要求,拟将整体程序分为三大模块。两个子模块相互独立,没有嵌套调用的情况,在主模块中调用上面两个子模块。

2.2任务定义

根据课设题目要求,拟将整体程序分为三大模块。两个子模块相互独立,没有嵌套调用的情况,在主模块中调用上面两个子模块以下是三个模块的大体分析:

(1) 建立有向图的存储结构。

(2) 应用Dijkstra算法求出该有向图的最短路径。

(3) 在主函数中调用两个子函数,完成最短路径的程序设。

3算法设计

3.1图的邻接矩阵的存储结构

一个图的邻接矩阵表示唯一的。故在图的邻接矩阵表示中,除了需要用一个二维数组存储顶点之间相邻关系的邻接矩阵外,通常还需要使用一个具有n个元素的一维数组存储顶点信息,其中下标为i的元素存储顶点vi的信息。本设计是基于类C语言的算法描述,因此,图的邻接矩阵的存储结构定义如下:

#define MVNum 50

typedef struct {

VertexType vexs[MVNum];

Adjmatrix arcs[MVNum][MVNum];

}Mgraph;

在本系统中,以邻接矩阵存储有向图,如图3.1a中有向图G所示,其邻接矩阵为

3.2 Dijkstra算法思想

(1)Dijkstra算法核心是贪心,实质是按路径长度递增产生诸顶点的最短路径算法。用自然语言描述如下:

初始化S和D,置空最短路径终点集,置初始的最短路径值;

S[v1]=TRUE;D[v1]=0;

While(S集中的顶点数

{

开始循环,每次求的v1到某个v顶点的最短路径,并将v加到S集中;

S[v]=TRUE; 更新当前最短路径及距离。

}

(2)Dijkstra算法结束后,通过设置一个数组记录下一个节点的前趋节点,然后通过倒叙的方式输出该最短路径。

4系统逻辑设计

4.1主函数流程图如图4.1所示

4.2 Create函数流程图如图4.2所示

4.3Dijkstra函数流程图如图4.3所示

5 源代码

#include

#include

#define MVNum 50

#define Maxint 1111

typedef char VertexType; // 定义顶点

typedef int Adjmatrix;

typedef enum {FALSE,TRUE}boolean;

typedef struct { // 图的邻接矩阵

VertexType vexs[MVNum]; //顶点向量存放顶点的一维数组

Adjmatrix arcs[MVNum][MVNum]; // 邻接矩阵二维数组

}MGraph; //定义邻接矩阵结构类型

void CreateMGraph(MGraph *G,int m,int n) // 采用数组(邻接矩阵)表示法,构造图G

{

int i,j,k,w;

char a,b;

for(i=1;i<=m;i++) //构造顶点向量

G->vexs[i]=i;

for(i=1;i<=m;i++) //初始化邻接矩阵

for(j=1;j<=m;j++)

G->arcs[i][j]=Maxint;

printf("输入%d条边的i,j及w:\n",n);

for(k=1;k<=n;k++) // 构造邻接矩阵

{

fflush(stdin);

scanf("%c,%c,%d",&a,&b,&w); //输入一条边依附的顶点及权值

i=a-'a'+1;

j=b-'a'+1;

G->arcs[i][j]=w; //弧的权值

}

printf("有向图的存储结构建立完成!\n");

printf("**********************************\n");

}

void Dijkstra(MGraph G,int v1,int m)

//用Dijkstra算法求G中v1顶点到其余顶点v的最短路径p[v]及带权长度D[v]

{

int D[MVNum],P[MVNum];

int v,i,w,min;

boolean S[MVNum];// S以求得最短路径的终点的集合

for(v=1;v<=m;v++)

{

S[v]=FALSE;

D[v]=G.arcs[v1][v];

if(D[v]

P[v]=v1;

else

P[v]=0;

}

D[v1]=0;S[v1]=TRUE; // 初始化,v1顶点属于s集

//开始主循环,每次求得v1到某个v顶点的最短路径,并加v到s集

for(i=2;i<=m;i++) // 其余n-1个顶点

{

min=Maxint; //当前所知离v1顶点的最近距离

for(w=1;w<=m;w++)

if(!S[w]&&D[w]

{

v=w;

min=D[w]; //w顶点离v1顶点更近

}

S[v]=TRUE;

for(w=1;w<=m;w++) //更新当前最短路径及距离

if(!S[w]&&(D[v]+G.arcs[v][w]

{

D[w]=D[v]+G.arcs[v][w];

P[w]=v;

}

}

printf("路径长度-----------路径\n");

for(i=1;i<=m;i++)

{

printf("%5d",D[i]);

printf("%12c",i-1+'a');v=P[i];

while(v!=0)

{

printf("<-%c",v-1+'a');

v=P[v];

}

printf("\n");

}

}

void main()

{

MGraph G;

int m,n,v;

char ch;

printf("输入所需图的顶点个数和边数m,n:"); scanf("%d,%d",&m,&n);

CreateMGraph(&G,m,n);

while (v<=m)

{

printf("求最短路径,请输入初始点v:"); fflush(stdin);

scanf("%c",&ch);

printf("\n");

v=ch-'a'+1;

Dijkstra(G,v,m);

}

}

6 调试与测试

6.1合法数据输入

(1)合法数据测试结果如图6.1所示

图6.1合法数据测试结果

6.2非法数据输入

(2)非法数据测试结果如图6.2所示

图6.2非法数据测试结果

当前任务已达到任务目标,对于n个顶点的有向图,求一个顶点到其他顶点的最短路径的时间为O(n),调整最短路径的循环共执行n-1次,所以,时间复杂度是O(n2)。采用邻接矩阵存储有向图,应处理每两个顶点之间的关系,所以空间复杂度为O(n2)。

实验三 最短路径的算法(离散数学实验报告)

实验3:最短路径算法 一、实验目的 通过本实验的学习,理解Floyd(弗洛伊得)最短路径算法的思想 二、实验内容 用C语言编程实现求赋权图中任意两点间最短路径的Floyd算法,并能对给定的两结点自动求出最短路径 三、实验原理、方法和手段 1、Floyd算法的原理 定义:Dk[i,j] 表示赋权图中从结点vi出发仅通过v0,v1,┉,vk-1中的某些结点到达vj的最短路径的长度, 若从vi到vj没有仅通过v0,v1,┉,vk-1 的路径,则D[i,j]=∝即 D-1[i,j] 表示赋权图中从结点vi到vj的边的长度,若没有从结点vi到vj的边,则D[i,j]=∝ D0[i,j] 表示赋权图中从结点vi到vj的”最短”路径的长度, 这条路上除了可能有v0外没有其它结点 D1[i,j] 表示赋权图中从结点vi到vj的”最短”路径的长度, 这条路上除了可能有v0,v1外没有其它结点 ┉┉┉ 根据此定义,D k[i,j]=min{ D k-1[i,j] , D k-1[i,k-1]+D k-1[k-1,j] } 定义:path[i,j]表示从结点vi到vj的“最短”路径上vi的后继结点 四、实验要求 要求输出每对结点之间的最短路径长度以及其最短路径 五、实验步骤 (一)算法描述 Step 1 初始化有向图的成本邻矩阵D、路径矩阵path 若从结点vi到vj有边,则D[i,j]= vi到vj的边的长度,path[i,j]= i; 否则D[i,j]=∝,path[i,j]=-1 Step 2 刷新D、path 对k=1,2,┉n 重复Step 3和Step 4 Step 3 刷新行对i=1,2,┉n 重复Step 4 Step 4 刷新Mij 对j=1,2,┉n 若D k-1[i,k]+D k-1[k,j]

数据结构,课程设计,校园最短路径问题

一、课程设计题目:校园最短路径问题 二、课程设计目的: 1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; 2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; 3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所具备的科学工作方法和作风。 三、课程设计要求: 1.设计的题目要求达到一定的工作量(300行以上代码),并具有一定的深度和难度。 2.编写出课程设计报告书,内容不少于10页(代码不算)。 四、需求分析: 1、问题描述 图的最短路径问题是指从指定的某一点v开始,求得从该地点到图中其它各地点的最短路径,并且给出求得的最短路径的长度及途径的地点。除了完成最短路径的求解外,还能对该图进行修改,如顶点以及边的增删、边上权值的修改等。 校园最短路径问题中的数据元素有: a) 顶点数 b) 边数 c) 边的长度 2、功能需求 要求完成以下功能: a)输出顶点信息:将校园内各位置输出。 b)输出边的信息:将校园内每两个位置(若两个位置之间有直接路径)的 距离输出。 c)修改:修改两个位置(若两个位置之间有直接路径)的距离,并重新输 出每两个位置(若两个位置之间有直接路径)的距离。 d)求最短路径:输出给定两点之间的最短路径的长度及途径的地点或输出 任意一点与其它各点的最短路径。 e)删除:删除任意一条边。 f)插入:插入任意一条边。 3、实现要点 a) 对图的创建采用邻接矩阵的存储结构,而且对图的操作设计成了模板类。 为了便于处理,对于图中的每一个顶点和每一条边都设置了初值。 b) 为了便于访问,用户可以先输出所有的地点和距离。 c) 用户可以随意修改两点之间好的距离。 d) 用户可以增加及删除边。 e) 当用户操作错误时,系统会出现出错提示。 五、概要设计:

MATLAB实验报告,遗传算法解最短路径以及函数最小值问题讲解

硕士生考查课程考试试卷 考试科目:MATLAB教程 考生姓名:考生学号: 学院:专业: 考生成绩: 任课老师(签名) 考试日期:20 年月日午时至时

《MATLAB 教程》试题: A 、利用MATLA B 设计遗传算法程序,寻找下图11个端点的最短路径,其中没有连接的端点表示没有路径。要求设计遗传算法对该问题求解。 a d e h k B 、设计遗传算法求解f (x)极小值,具体表达式如下: 3 21231(,,)5.12 5.12,1,2,3 i i i f x x x x x i =?=???-≤≤=? ∑ 要求必须使用m 函数方式设计程序。 C 、利用MATLAB 编程实现:三名商人各带一个随从乘船渡河,一只小船只能容纳二人,由他们自己划行,随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货,但是如何乘船渡河的大权掌握在商人手中,商人们怎样才能安全渡河? D 、结合自己的研究方向选择合适的问题,利用MATLAB 进行实验。 以上四题任选一题进行实验,并写出实验报告。

选择题目: A 一、问题分析(10分) 1 4 10 11 如图如示,将节点编号,依次为 1.2.3.4.5.6.7.8.9.10.11,由图论知识,则可写出其带权邻接矩阵为: 0 2 8 1 500 500 500 500 500 500 500 2 0 6 500 1 500 500 500 500 500 500 8 6 0 7 500 1 500 500 500 500 500 1 500 7 0 500 500 9 500 500 500 500 500 1 500 500 0 3 500 2 500 500 500 500 500 1 500 3 0 4 500 6 500 500 500 500 500 9 500 4 0 500 500 1 500 500 500 500 500 2 500 500 0 7 500 9 500 500 500 500 500 6 500 7 0 1 2 500 500 500 500 500 500 1 500 1 0 4 500 500 500 500 500 500 500 9 2 4 0 注:为避免计算时无穷大数吃掉小数,此处为令inf=500。 问题要求求出任意两点间的最短路径,Floyd 算法采用的是在两点间尝试插入顶点,比较距离长短的方法。我思考后认为,用遗传算法很难找到一个可以统一表示最短路径的函数,但是可以对每一对点分别计算,然后加入for 循环,可将相互之间的所有情况解出。观察本题可发现,所有节点都是可双向行走,则可只计算i 到j 的路径与距离,然后将矩阵按主对角线翻折即可得到全部数据。 二、实验原理与数学模型(20分) 实现原理为遗传算法原理: 按所选择的适应度函数并通过遗传中的复制、交叉及变异对个体进行筛选,使得适应度高的个体被保留下来,组成新的群体,新的群体既继承了上一代的信息,又优于上一代。这样周而复始,群体中个体适应度不断提高,直到满足一定的条件。 数学模型如下: 设图G 由非空点集合12{,...}n V V V V = 和边集合12{,...}m E e e e = 组成,其中121221(,)e ,P ,)(P ,P ), i i i i i i i i e P P E P =∈≠且若(则G 为一个有向图; 又设i e 的值为i a ,12{,...},m A a a a = 故G 可表示为一个三元组{,,}G P E A = 则求最短路径的数学模型可以描述为:

数据结构课程设计报告Dijkstra算法求最短路径

中南大学 《数据结构》课程设计 题目第9题 Dijkstra算法求最短路径 学生姓名 XXXX 指导教师 XXXX 学院信息科学与工程学院 专业班级 XXXXXXX 完成时间 XXXXXXX

目录 第一章问题分析与任务定义---------------------------------------------------------------------3 1.1 课程设计题目-----------------------------------------------------------------------------3 1.2 原始数据的输入格式--------------------------------------------------------------------3 1.3 实现功能-----------------------------------------------------------------------------------3 1.4 测试用例-----------------------------------------------------------------------------------3 1.5 问题分析-----------------------------------------------------------------------------------3 第二章数据结构的选择和概要设计------------------------------------------------------------4 2.1 数据结构的选择--------------------------------------------------------------------------4 2.2 概要设计-----------------------------------------------------------------------------------4 第三章详细设计与编码-----------------------------------------------------------------------------6 3.1 框架的建立---------------------------------------------------------------------------------6 3.2 点结构体的定义---------------------------------------------------------------------------7 3.3 创立带权值有向图------------------------------------------------------------------------8 3.4 邻接矩阵的显示---------------------------------------------------------------------------9 3.5 递归函数的应用---------------------------------------------------------------------------10 3.6 Dijkstra算法实现最短路径--------------------------------------------------------------10 第四章上机调试------------------------------------------------------------------------------------11 4.1 记录调试过程中错误和问题的处理---------------------------------------------------11 4.2 算法的时间课空间性能分析------------------------------------------------------------11 4.3 算法的设计、调试经验和体会---------------------------------------------------------11 第五章测试结果-----------------------------------------------------------------------------------12 第六章学习心得体会-----------------------------------------------------------------------------12 第七章参考文献-----------------------------------------------------------------------------------12 附录------------------------------------------------------------------------------------------------------12

分支限界法实现单源最短路径问题

实验五分支限界法实现单源最短路径 一实验题目:分支限界法实现单源最短路径问题 二实验要求:区分分支限界算法与回溯算法的区别,加深对分支限界法的理解。 三实验内容:解单源最短路径问题的优先队列式分支限界法用一极小堆来存储活结点表。其优先级是结点所对应的当前路长。算法从图G的源顶点s和空优先队列开始。 结点s被扩展后,它的儿子结点被依次插入堆中。此后,算法从堆中取出具有最小当前路长的结点作为当前扩展结点,并依次检查与当前扩展结点相邻的所有顶点。如果从当前扩展结点i到顶点j有边可达,且从源出发,途经顶点i再到顶点j的所相应的路径的长度小于当前最优路径长度,则将该顶点作为活结点插入到活结点优先队列中。这个结点的扩展过程一直继续到活结点优先队列为空时为止。 四实验代码 #include using namespace std; const int size = 100; const int inf = 5000; //两点距离上界 const int n = 6; //图顶点个数加1 int prev[n]; //图的前驱顶点 int dist[] = {0,0,5000,5000,5000,5000}; //最短距离数组 int c[n][n] = {{0,0,0,0,0,0},{0,0,2,3,5000,5000}, //图的邻接矩阵 {0,5000,0,1,2,5000},{0,5000,5000,0,9,2}, {0,5000,5000,5000,0,2},{0,5000,5000,5000,5000,0}}; const int n = 5; //图顶点个数加1 int prev[n]; //图的前驱顶点 int dist[] = {0,0,5000,5000,5000}; int c[][n] = {{0,0,0,0,0},{0,0,2,3,5000},{0,5000,0,1,2},{0,5000,5000,0,9}, {0,5000,5000,5000,0}};

《数据结构课程设计》最短路径问题实验报告

《数据结构课程设计》最短路径问题实验报告

目录 一、概述 0 二、系统分析 0 三、概要设计 (1) 四、详细设计 (5) 4.1建立图的存储结构 (5) 4.2单源最短路径 (6) 4.3任意一对顶点之间的最短路径 (7) 五、运行与测试 (8) 参考文献 (11) 附录 (12)

交通咨询系统设计(最短路径问题)一、概述 在交通网络日益发达的今天,针对人们关心的各种问题,利用计算机建立一个交通咨询系统。在系统中采用图来构造各个城市之间的联系,图中顶点表示城市,边表示各个城市之间的交通关系,所带权值为两个城市间的耗费。这个交通咨询系统可以回答旅客提出的各种问题,例如:如何选择一条路径使得从A城到B城途中中转次数最少;如何选择一条路径使得从A城到B城里程最短;如何选择一条路径使得从A城到B城花费最低等等的一系列问题。 二、系统分析 设计一个交通咨询系统,能咨询从任何一个城市顶点到另一城市顶点之间的最短路径(里程)、最低花费或是最少时间等问题。对于不同的咨询要求,可输入城市间的路程、所需时间或是所需费用等信息。 针对最短路径问题,在本系统中采用图的相关知识,以解决在实际情况中的最短路径问题,本系统中包括了建立图的存储结构、单源最短问题、对任意一对顶点间最短路径问题三个问题,这对以上几个问题采用了迪杰斯特拉算法和弗洛伊德算法。并未本系统设置一人性化的系统提示菜单,方便使用者的使用。

三、概要设计 可以将该系统大致分为三个部分: ①建立交通网络图的存储结构; ②解决单源最短路径问题; ③实现两个城市顶点之间的最短路径问题。

迪杰斯特拉算法流图:

单源最短路径 贪心算法

实验三单源最短路径 一、实验目的及要求 掌握贪心算法的基本思想 用c程序实现单源最短路径的算法 二、实验环境 Window下的vc 2010 三、实验内容 1、有向图与单源点最短路径 2、按路径长度非降的次序依次求各节点到源点的最短路径 3、Dijkstra算法 四、算法描述及实验步骤 设给定源点为Vs,S为已求得最短路径的终点集,开始时令S={Vs} 。当求得第一条最短路径(Vs ,Vi)后,S为{Vs,Vi} 。根据以下结论可求下一条最短路径。 设下一条最短路径终点为Vj ,则Vj只有:源点到终点有直接的弧 ;从Vs 出发到Vj 的这条最短路径所经过的所有中间顶点必定在S中。即只有这条最短路径的最后一条弧才是从S内某个顶点连接到S外的顶点Vj 。 若定义一个数组dist[n],其每个dist[i]分量保存从Vs 出发中间只经过集合S中的顶点而到达Vi的所有路径中长度最小的路径长度值,则下一条最短路径的终点Vj必定是不在S中且值最小的顶点, 即:dist[i]=Min{ dist[k]| Vk∈V-S } 利用公式就可以依次找出下一条最短路径。 在程序中c[][]表示带权邻接矩阵, dist[]表示顶点到源点的最短路径, p[]记录顶点到源点最短路径的前驱节点, u源点,函数Way是递归的构造出最短路径的次序。 五、实验结果 程序执行的结果: 六、源代码 #include #include using namespace std;

#define MAX 999 void getdata(int **c,int n) { int i,j; int begin,end,weight; for (i=1;i<=n;i++) { for (j=1;j<=n;j++) { if(i==j) c[i][j]=0; else c[i][j]=MAX; } } do { cout<<"请输入起点终点权值(-1退出):"; cin>>begin; if(begin==-1) break; cin>>end>>weight; c[begin][end]=weight; } while(begin!=-1); } void Dijkstra(int n,int v ,int *dist,int *prev,int **c) { bool s[MAX]; int i,j; for (i=1;i<=n;i++) { dist[i]=c[v][i]; //从源点到各点的值 s[i]=false; if(dist[i]==MAX) prev[i]=0; //最大值没有路径 else prev[i]=v; //前驱为源点 } dist[v]=0;s[v]=true; for (i=1;i<=n;i++) { int temp=MAX; int u=v; for(j=1;j<=n;j++) if((!s[j])&&(dist[j]

最短路径实验报告

一、实验目的 学习掌握图的存储结构 利用最短路径算法,通过java编程实现最短路径输出。 二、实验环境 Eclipse平台 三、实验过程 最短路径算法问题是计算机科学、运筹学、地理信息系统和交通诱导、导航系统等领域研究的一个热点。传统的最短路径算法主要有Floyd算法和Dijkstra算法。Floyd 算法用于计算所有结点之间的最短路径。Dijkstra算法则用于计算一个结点到其他所有结点的最短路径。本程序利用Dijkstra算法用java语言实现最短路径的可视化。 流程: 画无向邻接矩阵邻接矩阵初始化求取最短路径 Java文件如下 M ain.java 文件: import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.StringTokenizer; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.TitledBorder; public class Main { public static void main(String args[]) { new UI("最短路径"); } } @SuppressWarnings("serial") class UI extends JFrame implements ActionListener, ItemListener { JFrame frame; JButton button;

单源最短路径问题

实验四单源最短路径问题 一、实验目的: 1、理解分支限界法的剪枝搜索策略; 2、掌握分支限界法的算法柜架; 3、掌握分支限界法的算法步骤; 4、通过应用范例学习动态规划算法的设计技巧与策略; 二、实验内容及要求: 1、使用分支限界法解决单源最短路径问题。 2、通过上机实验进行算法实现。 3、保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告。 三、实验原理: 分支限界法的基本思想: 1、分支限界法与回溯法的不同: 1)求解目标:回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。 2)搜索方式的不同:回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。 2、分支限界法基本思想: 分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。 在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。

此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。 3、常见的两种分支限界法: 1)队列式(FIFO)分支限界法 按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。 2)优先队列式分支限界法 按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。 四、程序代码 #include using namespace std; int matrix[100][100]; // 邻接矩阵 bool visited[100]; // 标记数组 int dist[100]; // 源点到顶点i的最短距离 int path[100]; // 记录最短路的路径 int source; // 源点 int vertex_num; // 顶点数 int edge_num; // 边数 int destination; // 终结点 void Dijkstra(int source) { memset(visited, 0, sizeof(visited)); // 初始化标记数组 visited[source] = true; for (int i = 0; i < vertex_num; i++) { dist[i] = matrix[source][i]; path[i] = source; } int min_cost; // 权值最小 int min_cost_index; // 权值最小的下标 for (int i = 1; i < vertex_num; i++) // 找到源点到另外 vertex_num-1 个点的最短路径{ min_cost = INT_MAX;

最短路径实验报告

云南财经大学信息学院学生综合性与设计性实验报告 (2013—2014 学年第 2 学期) 周次:第7周日期:2014年 4 月 17 日地点: 一、实验内容与目的 1.内容 查看“最短路径.swf”,选择熟悉的程序设计语言定义有向图,根据动画演示求取从有向图任一结点到其他结点的最短路径。 2.实验目的 了解最短路径的概论,掌握求最短路径的方法。 二、实验原理或技术路线(可使用流程图描述) 实验原理:(李燕妮负责设计,周丽琼负责编程) 图是由结点的有穷集合V和边的集合E组成,求最短路径用迪杰斯特拉算法: 1)适用条件&范围: a) 单源最短路径(从源点s到其它所有顶点v); b) 有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E的有向图) c) 所有边权非负(任取(i,j)∈E都有Wij≥0); 2)算法描述: a)初始化:dis[v]=maxint(v∈V,v≠s); dis[s]=0; pre[s]=s; S={s}; b)For i:=1 to n 1.取V-S中的一顶点u使得dis[u]=min{dis[v]|v∈V-S}

2.S=S+{u} 3.For V-S中每个顶点v do Relax(u,v,Wu,v) c)算法结束:dis[i]为s到i的最短距离;pre[i]为i的前驱节点 三、实验环境条件(使用的软件环境) Microsoft Visual C++6.0 四、实验方法、步骤(列出程序代码或操作过程) /*本程序的功能是求图中任意两点间的最短路径*/ #include #include #include #include #define ING 9999 typedef struct ArcCell{ int adj; /*顶点关系类型,用1表示相邻,0表示不相邻*/ }ArcCell,**AdjMatrix; /*邻接矩阵*/ typedef struct type{ char data[3]; /*顶点值*/ }VertexType; typedef struct{ VertexType *vexs; /*顶点向量*/ AdjMatrix arcs; /*邻接矩阵*/ int vexnum,arcnum; /*图的顶点数和边数*/ }MGraph; /*初始图*/ void InitGraph(MGraph *G) { int i,nu,mu; printf("\n输入顶点的个数和(边)弧的个数:"); scanf("%d %d",&nu,&mu); G->arcs=(ArcCell **)malloc(nu*sizeof(ArcCell *)); for(i=0;iarcs[i]=(ArcCell *)malloc(nu*sizeof(ArcCell)); G->vexs=(VertexType *)malloc(nu*sizeof(VertexType)); /*分配顶点空间*/ G->vexnum=nu;G->arcnum=mu; /*图的顶点数和边数*/ }

数据结构课程设计报告_最短路径C++

青岛理工大学琴岛学院 设计报告 课题名称:求解最优交通路径 学院:计算机工程系 专业班级:计算机科学与技术 学号:####### 学生:** 指导教师:** 青岛理工大学琴岛学院教务处 2011 年 7 月 7日

图1 B.具体功能实现及相应的弗洛伊德算法 首先,建立查询信息对话框,使用户能够录入需要查询的城市代号,并显示路径长度及最短路径沿途经过的城市。并相应地添加如下变量int m_v0;int m_v1;int m_lj;CString m_zd; 具体代码如下: #define MAXV 25 //最大顶点个数 #define INF 32767 //用32767表示∞ //以下定义邻接矩阵类型 typedef struct { int no; //顶点编号 char name[10]; //顶点名称 } VertexType; //顶点类型 typedef struct //图的定义 { int edges[MAXV][MAXV]; //邻接矩阵 int vexnum,arcnum; //顶点数,弧数 VertexType vexs[MAXV]; //存放顶点信息 } MGraph; //图的邻接矩阵类型 1.通过函数CreatUDN()存放城市路径信息,输入顶点之间的路径长度,创建带权图的邻接矩阵。 void CTDialog::CreatUDN() { MGraph *g=(MGraph*)malloc(sizeof(MGraph)); int i,j; for(i=0;iedges[i][j]=INF; if(i==j)g->edges[i][j]=0; //初始化置任意两城市之间距离为无穷大,即两城市之间没有直接通路

单源最短路径的Dijkstra算法

单源最短路径的Dijkstra算法: 问题描述: 给定一个带权有向图G=(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到所有其他各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。 算法描述: Dijkstra算法是解单源最短路径的一个贪心算法。基本思想是:设置顶点集合S并不断地做贪心选择来扩充这个集合。一个顶点属于S当且仅当从源到该顶点的最短路径长度已知。初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist做必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其他顶点之间的最短路径长度。 源代码: #include #define MAX 1000 #define LEN 100 int k=0, b[LEN];

using namespace std; //-------------------------------------数据声明------------------------------------------------//c[i][j]表示边(i,j)的权 //dist[i]表示当前从源到顶点i的最短特殊路径长度 //prev[i]记录从源到顶点i的最短路径上的i的前一个顶点 //--------------------------------------------------------------------------------------------- void Dijkstra(int n, int v, int dist[], int prev[], int c[][LEN]) { bool s[LEN]; // 判断是否已存入该点到S集合中 for (int i = 1; i <= n; i++) { dist[i] = c[v][i]; s[i] = false; //初始都未用过该点 if (dist[i] == MAX) prev[i] = 0; //表示v到i前一顶点不存在 else prev[i] = v; } dist[v] = 0; s[v] = true;

最短路径_Dijkstra算法__实验报告

实验六:编程实现Dijkstra 算法求最短路问题. 1.需求分析: 首先让用户输入一个带权的有向图,输入时可通过一对一对输入存在弧的两个弧头与弧尾顶点以及弧上的权值从而输入整个有向图。用户输入一对对弧后,我们可以采用数组的形式来进行存储每个顶点之间的权值,最后由用户输入该有向图的源点(即每个最短路径的起点),要求源点必须为刚才输入的各顶点中的某一个,如果用户输入错误,程序要给出错误信息提示并退出程序。然后,我们可以设计一个Graph这样的类,将对关系的各种操作放入其中,然后我们在主函数中调运这个类就可以实现最短路问题的求解了。 2.概要设计: ①.构造一个新的类Graph: class Graph { private: int arcs[MAX][MAX],Path[MAX][MAX],D[MAX]; int arcnum,vexnum,weight,v0; Type a,b,vexs[MAX]; public: void Creat_Graph(); void Show_ShortestPath(); void ShortestPath_DIJ(); }; ②.结构化调用类中方法的主函数: int main() { Graph G; G.Creat_Graph(); G.ShortestPath_DIJ(); G.Show_ShortestPath(); return 0; } 3.代码实现: #include #define MAX 100 #define INFINITY INT_MAX enum BOOL{FALSE,TRUE}; using namespace std; template class Graph {

实验四图的最短路径弗洛伊德算法实现

数据结构与算法课程实验报告实验四:图的相关算法应用 姓名:王连平 班级:09信科2班 学号:I09630221

实验四图的相关算法应用 一、实验内容 求有向网络中任意两点之间的最短路。 二、实验目的 掌握图和网络的定义,掌握图的邻接矩阵、邻接表和十字链表等存储表示。掌握图的深度和广度遍历算法,掌握求网络的最短路的标号法和floyd算法。 三、问题描述 对于下面一张若干个城市以及城市间距离的地图,从地图中所有可能的路径中求出任意两个城市间的最短距离及路径,给出任意两个城市间的最短距离值及途径的各个城市。 四、问题的实现 4.1数据结构的抽象数据类型定义和说明 1) typedef struct ArcCell{//储存弧信息 int Distance; ArcCell *info;//此项用来保存弧信息,,在本实验中没有相关信息要保存 }ArcCell,AdjMatrix[ MAX_VERTEX_NUM][ MAX_VERTEX_NUM]; typedef struct{//储存顶点信息 string vexs[ MAX_VERTEX_NUM];//顶点向量

AdjMatrix arcs;//邻接矩阵 int vexnum , arcnum;//图的当前顶点数和弧数 }MGraph; 顶点信息和弧信息都是用来建立一个有向网G 2) d[v][w];//G中各对顶点的带权长度 若P[v][w][u]为TRUE,则u是从v到w当前求得最短路径上的顶点 4.2主要的实现思路 首先通过一个函数(CreateDN)建立图的邻接矩阵储存方式,一次输入某条弧的起点,终点,和权值。通过调用Locate函数来找到该弧在邻接矩阵中的相应位置。 其次运用弗洛伊德算法来求各定点的最短路劲,具体思路为:如果从v到w有弧,则存在一条长度为arcs[v][w]的路径,该路径不一定是最短路径。考虑路径(v,u,w)是否存在,若存在,比较(v,w)和(v,u,w)的长度,取较短者为从v到w的中间点序号不大于0的最短路径。以此类推,每次增加一个点,从而求出任意两点间的最短路径。这样,经过n次比较后,所求得的必为从v到w的最短路径。按此方法,可以同时求得任意两点间的最短路径。 五、主要源程序代码(包含程序备注) #include #include using namespace std; #define INfinity 10000//最大值 # define MAX_VERTEX_NUM 10//最大顶点数 typedef struct ArcCell{//储存弧信息 int Distance; ArcCell *info; }ArcCell,AdjMatrix[ MAX_VERTEX_NUM][ MAX_VERTEX_NUM]; typedef struct{//储存顶点信息 string vexs[ MAX_VERTEX_NUM];//顶点向量 AdjMatrix arcs;//邻接矩阵 int vexnum , arcnum;//图的当前顶点数和弧数 }MGraph; int Locate(MGraph &G,string v) { int a=0; for (int i=0;i

单源最短路径

单源最短路径问题 I 用贪心算法求解 贪心算法是一种经典的算法,通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。一般具有2个重要的性质:贪心选择性质和最优子结构性质。 一、问题描述与分析 单源最短路径问题是一个经典问题,给定带权有向图G =(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到所有其他各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。 分析过程:运用Dijkstra算法来解决单源最短路径问题。 具备贪心选择性质 具有最优子结构性质 计算复杂性 二、算法设计(或算法步骤) 用贪心算法解单源最短路径问题: 1.算法思想: 设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其他顶点之间的最短路径长度。 2.算法步骤: (1) 用带权的邻接矩阵c来表示带权有向图, c[i][j]表示弧上的权值. 若?V,则置c[i][j]为∞。设S为已知最短路径的终点的集合,它的初始状态为空集。 从源点v到图上其余各点vi的当前最短路径长度的初值为:dist[i]=c[v][i] vi∈V。 (2) 选择vj, 使得dist[j]=Min{dist[i] | vi∈V-S},vj就是长度最短的最短路径的终点。令

最短路径算法实验报告

东华大学计算机学院离散数学 实验五:最短路径 实验所属系列:离散数学课后实验 实验对象:本科 相关课程及专业:离散数学,计算机专业 实验类型:课后实验 实验时数(学分):4学时 实验目的 学习图的最短路径算法的实现。 实验内容与要求 根据输入的图形(实验四),输入起点和终点,求出最短路径和最短路径的长度。 实验的软硬件环境 PC机一台,装有VC++6.0或其它C语言集成开发环境。 实验准备 熟悉最短路径算法。 实验步骤 1.编写一段代码,接收键盘的输入定点的数量,并以输入的整数对作为边来建立图形的邻接矩阵(无向权重图)。 例如:5,6,12 表示定点5和定点6间有边,边的权重为12。 2 打印出邻接矩阵。 3.输入起点和终点。 4、打印最短路径和最短路径的长

#include #define BIG 9999 void dijkstra(int cost[][6],int n,int st,int distance[]) { int s[6]; int mindis,dis; int i,j,u; for(i=0;i

A算法的改进课程设计

沈阳大学

Floyd-Warshall算法的描述如下: for k ← 1 to n do for i ← 1 to n do for j ← 1 to n do if (Di,k + Dk,j < Di,j) then Di,j ← Di,k + Dk,j; 其中Di,j表示由点i到点j的代价,当Di,j为∞表示两点之间没有任何连接。 (2)Dijkstra 求单源、无负权的最短路。时效性较好,时间复杂度为O(V*V+E)。 源点可达的话,O(V*lgV+E*lgV)=>O(E*lgV)。 当是稀疏图的情况时,此时E=V*V/lgV,所以算法的时间复杂度可为O(V^2)。若是斐波那契堆作优先队列的话,算法时间复杂度,则为O(V*lgV + E)。 (3)Bellman-Ford 求单源最短路,可以判断有无负权回路(若有,则不存在最短路),时效性较好,时间复杂度O(VE)。 Bellman-Ford算法是求解单源最短路径问题的一种算法。 单源点的最短路径问题是指:给定一个加权有向图G和源点s,对于图G中的任意一点v,求从s到v的最短路径。与Dijkstra算法不同的是,在Bellman-Ford算法中,边的权值可以为负数。设想从我们可以从图中找到一个环路(即从v出发,经过若干个点之后又回到v)且这个环路中所有边的权值之和为负。那么通过这个环路,环路中任意两点的最短路径就可以无穷小下去。如果不处理这个负环路,程序就会永远运行下去。而Bellman-Ford算法具有分辨这种负环路的能力。A*(A-Star)算法是一种静态路网中求解最短路最有效的直接搜索方法。注意是最有效的直接搜索算法。之后涌现了很多预处理算法(ALT,CH,HL等等),在线查询效率是A*算法的数千甚至上万倍。公式表示为:f(n)=g(n)+h(n),其中f(n) 是从初始点经由节点n到目标点的估价函数,g(n) 是在状态空间中从初始节点到n节点的实际代价,h(n) 是从n到目标节点最佳路径的估计代价。保证找到最短路径(最优解的)条件,关键在于估价函数h(n)的选取:

相关文档
最新文档