当前位置:文档之家› 数据结构最短路径

数据结构最短路径

数据结构最短路径
数据结构最短路径

图的最短路径

一、实验目的

1.使学生熟悉最短路径的算法实现

二、掌握带权图的存储结构和处理方法

1.硬件:每个学生需配备计算机一台。操作系统:DOS或Windows

2.软件:DOS或Windows操作系统+Turbo C;

三、实验要求

1.能够独立完成带权图的存储和最短路径的生成

四、实验内容

1.现在假设我国铁路交通图如下(权值表示距离),请用合适的存储结构将下图存储到计算机中方便进行处理。

2.现在我想以最小的代价从徐州出发到达其他目的地,请用Dijkstra算法实现我的要求的路径。

#include"stdio.h"

#include"malloc.h"

typedef struct

{int*vexs;

int**arcs;

int vexnum;

}graph_hc;

typedef struct

{int adjvex;

int lowcost;

}markedg_hc;

graph_hc*initgraph_hc()

{int i,j;graph_hc*g;

g=(graph_hc*)malloc(sizeof(graph_hc));

g->vexnum=25;

g->vexs=(int*)malloc(g->vexnum*sizeof(int));

g->arcs=(int**)malloc(g->vexnum*sizeof(int*));

for(i=0;ivexnum;i++)

g->arcs[i]=(int*)malloc(g->vexnum*sizeof(int));

for(i=0;ivexnum;i++)

for(j=0;jvexnum;j++)

{g->arcs[i][j]=0;}

return g;}

void creategraph_hc(graph_hc *g)

{int i,j;

for(i=0;ivexnum;i++)g->vexs[i]=i;

g->arcs[0][9]=1892; g->arcs[1][3]=242;

g->arcs[2][4]=668; g->arcs[2][9]=1145;

g->arcs[3][5]=305; g->arcs[4][6]=137;

g->arcs[4][11]=695; g->arcs[5][6]=704;

g->arcs[5][7]=397; g->arcs[6][12]=674;

g->arcs[8][9]=216; g->arcs[9][10]=676;

g->arcs[10][11]=511;g->arcs[10][13]=842;

g->arcs[11][12]=349;g->arcs[11][14]=534;

g->arcs[12][15]=651;g->arcs[13][16]=110;

g->arcs[13][17]=967;g->arcs[14][18]=409;

g->arcs[15][19]=825;g->arcs[16][17]=639;

g->arcs[17][18]=902;g->arcs[17][21]=607;

g->arcs[18][19]=367;g->arcs[18][21]=672;

g->arcs[18][23]=675;g->arcs[19][20]=622;

g->arcs[21][22]=255;g->arcs[23][24]=140;

for(i=0;ivexnum;i++)

for(j=i;jvexnum;j++)

if(g->arcs[i][j])

g->arcs[j][i]=g->arcs[i][j];}

void printgraph_hc(graph_hc*g)

{int x,y;

printf("\n城市间连通图为:\n");

for(x=0;xvexnum;x++)

for(y=x;yvexnum;y++)

if(g->arcs[x][y])printf("(%d,%d)距离:%d\t",x,y,g->arcs[x][y]);}

int selectnearvex_hc(markedg_hc*mark,int*flag,int num)

{int j;

int nearestv;

int lowcost=32767;

for(j=0;j

{if(flag[j]!=1&&mark[j].lowcost

{nearestv=j;

lowcost=mark[j].lowcost;}}

flag[nearestv]=1;

return nearestv;}

void markothervex_hc(graph_hc*g,markedg_hc*mark,int nearestv,int num,int*flag) {int j;

for(j=0;j

{if(g->arcs[nearestv][j]>0)

{if(flag[j]!=1)

{if(mark[j].lowcost>(mark[nearestv].lowcost+g->arcs[nearestv][j]))

{mark[j].lowcost= mark[nearestv].lowcost+g->arcs[nearestv][j];

mark[j].adjvex=nearestv;}}}}}

void shortestpath_hc(graph_hc*g,markedg_hc*mark,int start)

{int i,num;

int*flag;

int nearestv;

num=g->vexnum;

flag=(int*)malloc((num)*sizeof(int));

flag[start]=1;

for(i=0;ivexnum;i++)

{mark[i].adjvex=start;

if( g->arcs[start][i]>0)

{mark[i].lowcost=g->arcs[start][i];}

else

{mark[i].lowcost=32767;}}

for(i=1;ivexnum;i++)

{nearestv=selectnearvex_hc(mark,flag,num);

markothervex_hc(g,mark,nearestv,num,flag);}}

void printshortpath_hc(graph_hc*g,markedg_hc*mark,int start)

{int i,j,k,path[25];

for(i=0;ivexnum;i++)

{if(i!=start)

{printf("从%d到%d最短路径为:%d; ",start,i,mark[i].lowcost);

printf("途经:");

k=0;path[k]=i;

j=mark[i].adjvex;

while(j!=start)

{path[++k]=j;

j=mark[j].adjvex;}

printf("%d",start);

for(j=k;j>=0;j--)printf(",%d",path[j]);

printf(".\n");}}}

main()

{int city;

graph_hc*g;markedg_hc*mark;

g=initgraph_hc();

creategraph_hc(g);

printf("城市名称/代号:");

printf("乌鲁木齐/0, 哈尔滨/1, 呼和浩特/2, 长春/3, 北京/4, ");

printf("沈阳/5, 天津/6, 大连/7, 西宁/8, 兰州/9, 西安/10, 郑州/11, ");

printf("徐州/12, 成都/13, 武汉/14, 上海/15, 昆明/16, 贵阳/17, 株州/18,"); printf("南昌/19, 福州/20, 柳州/21, 南宁/22, 广州/23, 深圳/24.\n");

printgraph_hc(g);

mark=(markedg_hc*)malloc(g->vexnum*sizeof(markedg_hc)); printf("\n输入起始城市:");scanf("%d",&city);

shortestpath_hc(g,mark,city);

printshortpath_hc(g,mark,city);

printf("\n作者:黄晨");}

数据结构课程设计报告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

数据结构最短路径

题目描述 一个图的存储矩阵如下所示(顶点分别是0、1、2、3、4、5): 0,12,18,∞,17,∞ 12, 0,10,3,∞,5 18,10,0,∞,21,11 ∞,3,∞,0,∞,8 17,∞,21,∞,0,16 ∞,5,11,8,16,0 试用邻接矩阵存储法和Floyd算法求解任意两个顶点的最短路径。 输入: 输入数据第一行为1个正整:顶点个数n(顶点将分别按0,1,…,n-1进行编号)。后面有n+1行,前n行都有n个整数(第i行第j个数表示顶点i-1和顶点j-1之间的边长,用10000来表示两个顶点之间无边);第n+1行输入一对顶点x和y 输出: x和y顶点的最短路径长度和最短路径(路径换行输出,只输出顶点编号序列)。 问题分析 题目要求图的存储类型为邻接矩阵,这种存储结构简单易懂,但存储占用较大;求最短路径的算法有Dijkstra算法和SPFA算法,三者相比,在代码的实现上,Floyd编写简单且容易理解,缺点是时间复杂度较高,不适合计算大量的数据。 数据结构及程序 #include #define inf 10000 #define maxn 11 int N,g[maxn][maxn]={0}; int path[maxn][maxn]={0}; void floyd() { for(int k=0;k

for(int i=0;i(g[i][k]+g[k][j])) { g[i][j]=g[i][k]+g[k][j]; path[i][j]=k; } } } int main() { scanf("%d",&N); for(int i=0;i",x); while(tmp!=y) { printf("%d->",tmp); tmp=path[tmp][y]; } printf("%d\n",y); } 运行结果

第20讲-关键路径与最短路径

数据结构第20次课

(续表)

思考.题 作业题试对下图所示的AOE网络,解答下列问题。 (1) 这个工程最早可能在什么时间结束。 (2) 求每个事件的最早开始时间Ve[i]和最迟开始时间Vl[I]。 (3) 求每个活动的最早开始时间e( )和最迟开始时间l( )。 (4) 确定哪些活动是关键活动。画出由所有关键活动构成的图,指出哪些活动加速可使整个工程提前完成。 *参考资料《数据结构辅导与提高》,徐孝凯编著,清华大学出版社 《数据结构习题解答与考试指导》,梁作娟等编著,清华大学出版社

授课内容 关键路径 对整个工程和系统,人们关心的是两个方面的问题: 一)工程能否顺利进行(对AOV网进行拓扑排序) 二)估算整个工程的完成所必须的最短时间(对AOE网求关键路径) 1. AOE-网 } 与AOV-网相对应的是AOE-网(Activity On Edge),即边表示活动的网。 AOE-网是一个带权的有向无环图,其中,顶点表示事件(Event),弧表示活 动,权表示活动持续的时间。通常,AOE-网可用来估算工程的完成时间。 例:下图是一个假想的有11项活动的AOE-网。其中有9个事件v 1 , v 2 ,…,v 9 ,每个事件表示在它之前的活动已经完成,在它之后的活动可以 开始。如v 1 表示整个工程开始,v 9 表示整个工程结束,v 5 表示a 4 和a 5 已经 完成,a 7 和a 8 可以开始。与每个活动相联系的数是执行该活动所需的时间。 比如,活动a 1 需要6天,a 2 需要4天等。 和AOV-网不同,对AOE-网有待研究的问题是: (1)完成整项工程至少需要多少时间 (2)哪些活动是影响工程进度的关键 2. 关键路径 由于在AOE-网中有些活动可以并行地进行,所以完成工程的最短时间 是从开始点到完成点的最长路径的长度(这里所说的路径长度是指路径上 各活动持续时间之和,不是路径上弧的数目)。路径长度最长的路径叫做关 备注: 回顾

数据结构最短路径

数据结构 设计说明书 单源点最短路径算法的实现 学生姓名王文刚 学号1418064056 班级网络1402 成绩 指导教师 数学与计算机科学学院 年月日

课程设计任务书 20 —20 学年第学期 课程设计名称:数据结构课程设计 课程设计题目:单源点最短路径算法的实现 完成期限:自年月日至年月日共 2 周设计内容: 1.任务说明 2.要求 3.参考资料 指导教师:教研室负责人: 课程设计评阅

摘要 设计了一求解最短路径的方法,该方法具有在输入的途中查找两个顶点之间的最短路径的功能。本方法采用VC++作为软件开发环境,采用Dijkstar函数来求取顶点之间的最短路径。,用户可以自己输入各个地点及其之间的距离,便于用户在不同情况下均可使用。 关键词:最短路径;Dijkstar;无向图;

目录 目录 1课题描述 (2) 2 需求分析 (3) 3概要设计 (4) 3.1 存储结构 (4) 3.2 算法描述 (5) 4详细设计 (6) 4.1 功能模块图 (6) 4.2 主函数 (6) 4.3 pd函数 (7) 4.4 CreateMGraph函数 (8) 4.5Dijkstar函数 (9) 5程序编码 (11) 6程序的调试与测试 (15) 8总结 (16) 参考文献 (17) 1.目录中可以只有一级标题 2.页码右侧对齐页边距 3.本页不需要页码 4.以上内容仅作参考,具体章节由课程设计类型确定

1课题描述 随着交通的发展,人民生活水平的提高。出门旅行变的越来越频繁,而且供暖也成为冬天不可或缺的内容。为了节约时间和金钱,所以人们都希望找到旅行目的地的最短路径和架设暖气的最短路径。那么如何找到最短路径呢?由于路径较多,手工计算比较麻烦,而且容易出错,因此人们用计算机语言代替手工计算求最短路径。而在计算机语言中迪杰斯特拉算法比较常见,简洁,故人们常借助计算机程序迪杰斯特拉算法求最短路径。这样可以广泛提高效率,容易理解。

数据结构-第六章-图-练习题及答案详细解析(精华版)

图 1. 填空题 ⑴ 设无向图G中顶点数为n,则图G至少有()条边,至多有()条边;若G为有向图,则至少有()条边,至多有()条边。 【解答】0,n(n-1)/2,0,n(n-1) 【分析】图的顶点集合是有穷非空的,而边集可以是空集;边数达到最多的图称为完全图,在完全图中,任意两个顶点之间都存在边。 ⑵ 任何连通图的连通分量只有一个,即是()。 【解答】其自身 ⑶ 图的存储结构主要有两种,分别是()和()。 【解答】邻接矩阵,邻接表 【分析】这是最常用的两种存储结构,此外,还有十字链表、邻接多重表、边集数组等。 ⑷ 已知无向图G的顶点数为n,边数为e,其邻接表表示的空间复杂度为()。 【解答】O(n+e) 【分析】在无向图的邻接表中,顶点表有n个结点,边表有2e个结点,共有n+2e个结点,其空间复杂度为O(n+2e)=O(n+e)。 ⑸ 已知一个有向图的邻接矩阵表示,计算第j个顶点的入度的方法是()。 【解答】求第j列的所有元素之和 ⑹ 有向图G用邻接矩阵A[n][n]存储,其第i行的所有元素之和等于顶点i的()。 【解答】出度

⑺ 图的深度优先遍历类似于树的()遍历,它所用到的数据结构是();图的广度优先遍历类似于树的()遍历,它所用到的数据结构是()。 【解答】前序,栈,层序,队列 ⑻ 对于含有n个顶点e条边的连通图,利用Prim算法求最小生成树的时间复杂度为(),利用Kruskal 算法求最小生成树的时间复杂度为()。 【解答】O(n2),O(elog2e) 【分析】Prim算法采用邻接矩阵做存储结构,适合于求稠密图的最小生成树;Kruskal算法采用边集数组做存储结构,适合于求稀疏图的最小生成树。 ⑼ 如果一个有向图不存在(),则该图的全部顶点可以排列成一个拓扑序列。 【解答】回路 ⑽ 在一个有向图中,若存在弧、、,则在其拓扑序列中,顶点vi, vj, vk的相对次序为()。 【解答】vi, vj, vk 【分析】对由顶点vi, vj, vk组成的图进行拓扑排序。 2. 选择题 ⑴ 在一个无向图中,所有顶点的度数之和等于所有边数的()倍。 A 1/2 B 1 C 2 D 4 【解答】C 【分析】设无向图中含有n个顶点e条边,则。

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

数据结构与算法课程实验报告实验四:图的相关算法应用 姓名:王连平 班级: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

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

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

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

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

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

迪杰斯特拉算法流图:

数据结构课程设计关键路径

数据结构课程设计-关键路径 #define max 20 #include #include #include using namespace std; typedef struct ArcNode//定义表结点 {int adjvex;//该弧所指向顶点的位置 struct ArcNode *nextarc;//指向下一条弧的指针 int info;//该弧的权值 }ArcNode; typedef struct VNode//定义头结点 {int data;//顶点信息 ArcNode *firstarc;//指向第一条依附该顶点的弧的指针}VNode,AdjList[max]; typedef struct//定义ALGraph {AdjList vertices; int vexnum,arcnum;//图的当前顶点数和弧数 int kind;//图的种类标志 }ALGraph; typedef struct//定义栈 {int *base;//栈底 int *top;//栈顶

}stack; void initstack(stack &s)//建立空栈{s.base=(int*)malloc(max*sizeof(int)); s.top=s.base; } int stackempty(stack s)//判断是否为空栈{if(s.base==s.top) return 1; else return 0; } int stackfull(stack s)//判断是否为满栈{if(s.top-s.base>=max) return 1; else return 0; } int pop(stack &s)//进行出栈 {int e;//出栈先进行赋值,后移动指针if(!stackempty(s)) {e=*(s.top-1); s.top--; return e; } else return NULL; }

数据结构最短路径课设报告

数据结构与算法 课程设计报告书 题目:导航最短路径查询 班级:11101111 学号:1110111105 姓名: 教师 周期:2012.12.17-2012.12.21 (以下由验收教师填写) 成绩: 2012年12月21日

《导航最短路径查询》 一、课程设计的目的与要求 (一)课程设计目的与任务 通过学习,了解并初步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、编码集成以及调试分析,熟练掌握数据结构的选择、设计、实现、以及操作方法,为进一步的开发应用打好基础。 (二)题目要求 要求在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。 二、设计正文 1、系统分析和开发背景 该程序所做的工作是给司机们提供最佳路线,来提高能源和时间的合理利用。 (1)把城市交通线路转化为图,从而对图进行相应的结构存储; (2)程序的输出信息主要为:起始城市到目的城市的最短路路径。 (3)程序的功能主要包括:城市之间路径的存储,最短路径的计算,以及最短路径和邻接矩阵的输出; 2 、功能详细描述 先假设有四个城市甲乙丙丁,甲乙相距2千米,且只有从乙到甲的单程线路。甲丙相距7千米,且只有从甲到丙的单程线路。甲丁相距4千米,且只有从甲到丁的单程线路。乙丙相距5千米,且只有从丙到乙的单程线路。乙丁相距3千米,且只有从丁到乙的单程线路。丙丁相距3千米,且只有从丁到丙的单程线路。戊甲相距6千米,且只有从戊到甲的单程线路。戊丁相距2千米,且只有从丁到戊的单程线路。乙己相距8千米,且只有从乙到己的单程线路。丙己相距6千米,且只有从己到丙单程线路。 编程出能求出个一点到任一点的最短路经。 3、数据结构设计 (1)typedef struct {int no; //顶点编号 InfoType info; //顶点其他信息,这里用于存放边的权值 }V ertexType; //顶点类型 typedef struct //图的定义 {int edges[MAXV][MAXV]; //邻接矩阵 int n,e; //顶点数,弧数 V ertexType vexs[MAXV]; //存放顶点信息 }MGraph; //图的邻接矩阵类型 //以下定义邻接表类型 typedef struct ANode //弧的结点结构类型

数据结构课程设计——关键路径

《数据结构》课程设计报告 课程题目:关键路径 学院: 班级: 学号: 姓名: 指导教师: 完成日期:

目录 一、需求分析 ............................... 错误!未定义书签。 二、概要设计 ............................... 错误!未定义书签。 三、详细设计 ............................... 错误!未定义书签。 四、调试分析 .............................. 错误!未定义书签。 五、用户使用说明 ...................... 错误!未定义书签。 六、测试结果 .............................. 错误!未定义书签。 七、附录 ..................................... 错误!未定义书签。

一、需求分析 1、问题描述 AOE网(即边表示活动的网络),在某些工程估算方面非常有用。它可以使人们了解:(1)研究某个工程至少需要多少时间(2)哪些活动是影响工程进度的关键在AOE网络中,从源点到汇点的有向路径可能不止一条,但只有各条路径上所有活动都完成了,这个工程才算完成。因此,完成整个工程所需的时间取决于从源点到汇点的最长路径长度,即在这条路径上所有活动的持续时间之和,这条路径就叫做关键路径(critical path)。 2、设计步骤 (1)、以某一工程为蓝本,采用图的结构表示实际的工程计划时间。 (2)、调查并分析和预测这个工程计划每个阶段的时间。 (3)、用调查的结果建立AOE网,并用图的形式表示。 (4 )、用CreateGraphic ()函数建立图的邻接表存储结构,能够输入图的顶点和边的信息,并存储到相应存储结构中。 (5)、用SearchMaxPath()函数求出最大路径,并打印出关键路径。 (6)、编写代码并调试、测试通过。 3、测试数据 ○v2○v5 ○v1○v4○v6 ○v3 6 v1 v2 v3 v4 v5 v6 8 v1 v2 a1 3 v1 v3 a2 2 v2 v4 a3 2 v2 v5 a4 3 v3 v4 a5 4 v3 v6 a6 3 v4 v6 a7 2 v5 v6 a8 1

数据结构最短路径

图的最短路径 一、实验目的 1.使学生熟悉最短路径的算法实现 二、掌握带权图的存储结构和处理方法 1.硬件:每个学生需配备计算机一台。操作系统:DOS或Windows 2.软件:DOS或Windows操作系统+Turbo C; 三、实验要求 1.能够独立完成带权图的存储和最短路径的生成 四、实验内容 1.现在假设我国铁路交通图如下(权值表示距离),请用合适的存储结构将下图存储到计算机中方便进行处理。 2.现在我想以最小的代价从徐州出发到达其他目的地,请用Dijkstra算法实现我的要求的路径。 #include"stdio.h" #include"malloc.h" typedef struct {int*vexs; int**arcs; int vexnum; }graph_hc; typedef struct {int adjvex; int lowcost; }markedg_hc; graph_hc*initgraph_hc() {int i,j;graph_hc*g; g=(graph_hc*)malloc(sizeof(graph_hc)); g->vexnum=25; g->vexs=(int*)malloc(g->vexnum*sizeof(int)); g->arcs=(int**)malloc(g->vexnum*sizeof(int*)); for(i=0;ivexnum;i++) g->arcs[i]=(int*)malloc(g->vexnum*sizeof(int)); for(i=0;ivexnum;i++) for(j=0;jvexnum;j++) {g->arcs[i][j]=0;} return g;} void creategraph_hc(graph_hc *g) {int i,j; for(i=0;ivexnum;i++)g->vexs[i]=i; g->arcs[0][9]=1892; g->arcs[1][3]=242;

数据结构 第六章 图 练习题及答案详细解析

图 1. 填空题 ⑴设无向图G中顶点数为n,则图G至少有()条边,至多有()条边;若G为有向图,则至少有()条边,至多有()条边。 【解答】0,n(n-1)/2,0,n(n-1) 【分析】图的顶点集合是有穷非空的,而边集可以是空集;边数达到最多的图称为完全图,在完全图中,任意两个顶点之间都存在边。 ⑵任何连通图的连通分量只有一个,即是()。 【解答】其自身 ⑶图的存储结构主要有两种,分别是()和()。 【解答】邻接矩阵,邻接表 【分析】这是最常用的两种存储结构,此外,还有十字链表、邻接多重表、边集数组等。 ⑷已知无向图G的顶点数为n,边数为e,其邻接表表示的空间复杂度为()。 【解答】O(n+e) 【分析】在无向图的邻接表中,顶点表有n个结点,边表有2e个结点,共有n+2e个结点,其空间复杂度为O(n+2e)=O(n+e)。 ⑸已知一个有向图的邻接矩阵表示,计算第j个顶点的入度的方法是()。 【解答】求第j列的所有元素之和 ⑹有向图G用邻接矩阵A[n][n]存储,其第i行的所有元素之和等于顶点i的()。 【解答】出度 ⑺图的深度优先遍历类似于树的()遍历,它所用到的数据结构是();图的广度优先遍历类似于树的()遍历,它所用到的数据结构是()。 【解答】前序,栈,层序,队列 ⑻对于含有n个顶点e条边的连通图,利用Prim算法求最小生成树的时间复杂度为(),利用Kruskal 算法求最小生成树的时间复杂度为()。 【解答】O(n2),O(elog2e) 【分析】Prim算法采用邻接矩阵做存储结构,适合于求稠密图的最小生成树;Kruskal算法采用边集数组做存储结构,适合于求稀疏图的最小生成树。 ⑼如果一个有向图不存在(),则该图的全部顶点可以排列成一个拓扑序列。 【解答】回路 ⑽在一个有向图中,若存在弧、、,则在其拓扑序列中,顶点vi, vj, vk的相对次序为()。 【解答】vi, vj, vk

数据结构课程设计汇本:拓扑排序和关键路径

1 ABSTRACT 1.1图和栈的结构定义 struct SqStack////栈部分 { SElemType *base;//栈底指针 SElemType *top;//栈顶指针 int stacksize;//栈的大小 int element_count;//栈中元素个素 }; /////////AOE网的存储结构 struct ArcNode //表结点 { int lastcompletetime;//活动最晚开始时间 int adjvex; //点结点位置 int info; //所对应的弧的权值 struct ArcNode *next;//指向下一个表结点指针 }; struct VNode //点结点 { VertexType data; //结点标志 int indegree; //该结点入度数 int ve; //记录结点的最早开始时间 int vl; //记录结点的最晚开始时间 struct ArcNode *first_out_arc; //存储下一个出度的表结点 struct ArcNode *first_in_arc;//存储下一个入度的表结点}; struct ALGraph { VNode *vertices; //结点数组 int vexnum; //结点数 int arcnum; //弧数 int kind; //该图的类型 };

2系统总分析 2.1关键路径概念分析 2.1.1什么是关键路径 关键路径法(Critical Path Method, CPM)最早出现于20世纪50年代,它是通过分析项目过程中哪个活动序列进度安排的总时差最少来预测项目工期的网络分析。这种方法产生的背景是,在当时出现了许多庞大而复杂的科研和工程项目,这些项目常常需要运用大量的人力、物力和财力,因此如何合理而有效地对这些项目进行组织,在有限资源下以最短的时间和最低的成本费用下完成整个项目就成为一个突出的问题,这样CPM就应运而生了。对于一个项目而言,只有项目网络中最长的或耗时最多的活动完成之后,项目才能结束,这条最长的活动路线就叫关键路径(Critical Path),组成关键路径的活动称为关键活动。 2.1.2关键路径特点 关键路径上的活动持续时间决定了项目的工期,关键路径上所有活动的持续时间总和就是项目的工期。 关键路径上的任何一个活动都是关键活动,其中任何一个活动的延迟都会导致整个项目完工时间的延迟。 关键路径上的耗时是可以完工的最短时间量,若缩短关键路径的总耗时,会缩短项目工期;反之,则会延长整个项目的总工期。但是如果缩短非关键路径上的各个活动所需要的时间,也不至于影响工程的完工时间。 关键路径上活动是总时差最小的活动,改变其中某个活动的耗时,可能使关键路径发生变化。可以存在多条关键路径,它们各自的时间总量肯定相等,即可完工的总工期。 关键路径是相对的,也可以是变化的。在采取一定的技术组织措施之后,关键路径有可能变为非关键路径,而非关键路径也有可能变为关键路径。 2.2关键路径实现过程 2.2.1结构选取 首先要选取建图的一种算法建立图,有邻接矩阵,邻接表,十字链表,邻接多重表等多种方法,要选取一种适当的方法建立图,才能提高算法效率,降低时间复杂度和空间复杂度。两个相邻顶点与它们之间的边表示活动,边上的数字表示活动延续的时间。对于给出的事件AOE网络,要求求出从起点到终点的所有路径,经分析、比较后找出长读最大的路径,从而得出求关键路径的算法,并给出计算机上机实现的源程序。完成不同路径的活动所需的时间虽然不同,但只有各

【数据结构算法】实验8 图的最短路径问题(附源代码)

浙江大学城市学院实验报告 课程名称数据结构与算法 实验项目名称实验八图的最短路径问题 实验成绩指导老师(签名)日期 一.实验目的和要求 1.掌握图的最短路径概念。 2.理解并能实现求最短路径的DijKstra算法(用邻接矩阵表示图)。 二. 实验内容 1、编写用邻接矩阵表示有向带权图时图的基本操作的实现函数,基本操作包括: ①初始化邻接矩阵表示的有向带权图void InitMatrix(adjmatrix G); ②建立邻接矩阵表示的有向带权图void CreateMatrix(adjmatrix G, int n) (即通过输入图的每条边建立图的邻接矩阵); ③输出邻接矩阵表示的有向带权图void PrintMatrix(adjmatrix G, int n) (即输出图的每条边)。 把邻接矩阵的结构定义以及这些基本操作函数存放在头文件Graph2.h中。2、编写求最短路径的DijKstra算法函数void Dijkstra( adjmatrix GA, int dist[], edgenode *path[], int i, int n) ,该算法求从顶点i到其余顶点的最短路径与最短路径长度,并分别存于数组path 和dist 中。编写打印输出从源点到每个顶点的最短路径及长度的函数void PrintPath(int dist[], edgenode *path[], int n)。 3、编写测试程序(即主函数),首先建立并输出有向带权图,然后计算并输出从某顶点v0到其余各顶点的最短路径。 要求:把指针数组的基类型结构定义edgenode、求最短路径的DijKstra算法函数、打印输出最短路径及长度的函数PrintPath以及主函数存放在文件 test9_2.cpp中。 测试数据如下:

最小生成树和最短路径数据结构实验

实验报告六月 18 2015 姓名:陈斌学号:E 专业:13计算机科学与技术数据结构第八次实验

学号E专业计算机科学与技术姓名陈斌 实验日期教师签字成绩 实验报告 【实验名称】最小生成树和最短路径 【实验目的】 (1)掌握最小生成树以及最短路径的相关概念; (2)掌握Prim算法和Kruskal算法; (3)掌握Dijkstra算法 【实验内容】 采用普里姆算法求最小生成树 (1)编写一个算法,对于教材图(a)所示的无向带权图G采用普里姆算法输出从顶点 V1出发的最小生成树。图的存储结构自选。 (2)对于上图,采用克鲁斯卡尔算法输出该图的最小生成树。(提示:a.先对边按 权值从小到大排序,得有序边集E;为所有顶点辅设一个数组Vset,标记各顶点所处的连通分量,初始时各不相同。b. 依次从E中取出一条边(i,j),检查顶点i和j是否属于同一连通分量,如是,则重取下一条边;否则,该边即为生成树的一条边,输出该边,同时将所有与j处于同一连通分量的顶点的Vset 值都修改为与i的相同。c.重复b步直至输出n-1条边。) 源代码: : #include<> #include<> #include<> dj=INFINITY; /* 网 */ }

printf("请输入%d条边的顶点1 顶点2 权值(用空格隔开): \n",; for(k=0;k<;++k) { scanf("%s%s%d%*c",va,vb,&w); /* %*c吃掉回车符 */ i=LocateVex(G,va); j=LocateVex(G,vb); [i][j].adj=[j][i].adj=w; /* 无向 */ } =AN; return OK; } typedef struct { /* 记录从顶点集U到V-U的代价最小的边的辅助数组定义 */ VertexType adjvex; VRType lowcost; }minside[MAX_VERTEX_NUM]; int minimum(minside SZ,MGraph G) { /* 求的最小正值 */ int i=0,j,k,min; while(!SZ[i].lowcost) i++; min=SZ[i].lowcost; /* 第一个不为0的值 */ k=i; for(j=i+1;j<;j++) if(SZ[j].lowcost>0)

数据结构课程设计-Floyd算法求解最短路径

数据结构课程设计报告撰写要求 (一)纸张与页面要求 1.采用国际标准A4型打印纸或复印纸,纵向打印。 2.封页和页面按照下面模板书写(正文为:小四宋体1.5倍行距)。 3.图表及图表标题按照模板中的表示书写。 (二)课设报告书的内容应包括以下各个部分:(按照以下顺序装订) 1.封页(见课设模版) 2、学术诚信声明,所有学生必须本人签字,否则教师拒绝给予成绩。 2.任务书(学生教师均要签字,信息填写完整) 3.目录 4.正文一般应包括以下内容: (1)题目介绍和功能要求(或描述) 课程设计任务的详细描述(注意不能直接抄任务书),将内容做更详细的具体的分析与描述; (2) 系统功能模块结构图 绘制系统功能结构框图及主要模块的功能说明; (3) 使用的数据结构的描述: 数据结构设计及用法说明; (4) 涉及到的函数的描述 ; (5) 主要算法描述( 程序流程图) (6) 给出程序测试/运行的结果 设计多组数据加以描述(包括输入数据和输出结果) (7) 课程设计的总结及体会 (8) 参考文献 格式要求:[1]作者,等. 书名.出版地:出版社,出版年 5.附录:程序清单 (应带有必要的注释)

沈阳航空航天大学 课程设计报告 课程设计名称:数据结构课程设计 课程设计题目:利用弗洛伊德(Floyd)算法求解 最短路径 院(系):计算机学院 专业:计算机科学与技术(物联网方向) 班级:34010105 学号: 姓名: 指导教师: 说明:结论(优秀、良好、中等、及格、不及格)作为相关教环节考核必要依据;格式不符合要求;数据不实,不予通过。报告和电子数据必须作为实验现象重复的关键依据。

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

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

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

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

弗洛伊德算法流图:

四、详细设计 建立图的存储结构 定义交通图的存储结构。邻接矩阵是表示图形中顶点之间相邻关系的矩阵。设G=(V,E)是具有n 个顶点的图,则G 的邻接矩阵是具有如下定义的n 阶方阵。 ?? ???∞>∈<=,其他情况或或,若0E(G)V ,V )V ,(V ],[j i j i ij W j i A 注:一个图的邻接矩阵表示是唯一的!其表示需要用一个二维数组存储顶点之间相邻关系的邻接矩阵并且还需要用一个具有n 个元素的一维数组来存储顶点信息(下标为i 的元素存储顶点i V 的信息)。 邻接矩阵的存储结构: #define MVNum 100

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

目录

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

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

四、详细设计 建立图的存储结构 定义交通图的存储结构。邻接矩阵是表示图形中顶点之间相邻关系的矩阵。设G=(V,E)是具有n个顶点的图,则G的邻接矩阵是具有如下定义的n阶方阵。 注:一个图的邻接矩阵表示是唯一的!其表示需要用一个二维数组存储顶点之间相邻关系的邻接矩阵并且还需要用一个具有n个元素的一维数组来存储顶点信息(下标为i的元素存储顶点 V的信 i 息)。 邻接矩阵的存储结构:

相关主题
文本预览
相关文档 最新文档