数据结构:单元最短路径,Dijkstra算法_实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告
实验十一:最短路径实验报告
姓名:戴铁泉班级:物联1001班学号:20101410305 完成日期:2012.05.23 实验目的:给定带权图G和源点V,求从V到G中其余各顶点的最短路径。
实验内容:
一、(a)问题描述:
若用有向网络表示莫地区的公路交通网,其中顶点表示该地区的一些主要场所,弧表示已有的公交路线,弧上的权表示票价。是谁己一个交通咨询系统,指导乘客以最少花费从该地区的莫一场所到达另一场所。
(b)基本要求:
(1)从文件中读入又向往中顶点的数量和顶点间的牌哦家的矩阵。
(2)以用户制定的起点和终点,输出从起点到终点的花费。
二、算法描述
(1)关于单源最短路径
1.记S为已经找到的从V0出发的最短路径的中点的集合,它的初始状态为空集。那么,从V出发到图上其余各顶点VI可能达到的最短路径的初始值为
D[i]=arcs[Locate Vex(G,V)][i].
2.选择Vj使得:
D[j]=Min{D[i] | vi不属于S} Vj就是当前求得的一条从V出发的最短路径的终点。
将j加入到S中。
3.修改从V出发到集合V—S上任意顶点Vk可达到的最短路径长度。如果:D[j]+arcs[j][k] 4.重复操作(2)(3)N-1次。由此求得从V到图上其余各顶点的最短路径是以路径长度递增的序列。 (2)关于图的深度优先搜索 深度优先搜索可以从图中的某个顶点V出发,访问此顶点,然后依次从V的未被访问过的邻接点出发深度优先遍历图,直至所有和V有路径相通的顶点都被访问过。 (3)关于图的广度优先搜索 从图中某顶点V出发,在访问了V之后一次访问V的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问他们的邻接点,并使“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有被已访问的顶点的邻接点都被访问到。 三、模块设计 (1)深度优先搜索 void dfs1(MGraph *G,int i){ int j; printf("%5s",G->vexs[i]); visited[i]=1; //标记VI,表示其已被访问 for(j=0;j if(i!=j&&G->arcs[i][j].adj!=INFINITY &&!visited[j]) dfs1(G,j); //递归调用 } (2)广度优先搜索 void bfs1(MGraph *G,int i){ int k,j; SqQueue Q; for(j=0;j visited[j]=0; //初始化数组 Initqueue_sq(&Q,G->vexnum); printf("\n%5s",G->vexs[i]); visited[i]=1; Enqueue_sq(&Q,i); //已访问过的初始点序号入队 while(!Queueempty(Q)){ Dequeue_sq(&Q,&k); for(j=0;j printf("%5s",G->vexs[j]); visited[j]=1; Enqueue_sq(&Q,j); //顶点序号J入队 } } } } (3)定位函数 int LocateVex(MGraph *G,char v[4]){ int i=0; while(i if(strcmp(G->vexs[i],v)==0) return i; i++; } printf("\n输入的顶点不存在!"); return 0; } (4)求单元最短路径 void shortesPath_DIJ(MGraph *G,int v0,int p[][MAX_VERTEX_NUM],int d[MAX_VERTEX_NUM]){ int i,j,v,min,w,final[MAX_VERTEX_NUM],v1,w1; for (v=0;v final[v]=0; //设置顶点已求得的最短路径为0 d[v]=G->arcs[v0][v].adj; for(w=0;w p[v][w]=0; //设空路径 if(d[v] p[v][v0]=1; //标记路径顶点 p[v][v]=1; } } printf("\nfinal[]:"); //打印初始状态 for(v1=0;v1 printf("%6d",final[v1]); printf("\n\n d[]:"); for(v1=0;v1 printf("%6d",d[v1]); printf("\n\np[][]:\n"); for(v1=0;v1 for(w1=0;w1 printf("%6d",p[v1][w1]); putchar('\n'); } d[v0]=0; final[v0]=1; //初始化V0属于S for(i=1;i min=INFINITY; for(w=0;w if(!final[w]) if(d[w] v=w; //最小值下标 min=d[w]; } final[v]=1; //将V加入S for(w=0;w if(!final[w]&&(min+G->arcs[v][w].adj d[w]=min+G->arcs[v][w].adj; for(j=0;j p[w][j]=p[v][j]; p[w][w]=1; } printf("\nfinal[]:"); //打印中间结果,跟踪数据变化 for(v1=0;v1 printf("%6d",final[v1]); printf("\n\n d[]:"); for(v1=0;v1 printf("%6d",d[v1]); printf("\n\np[][]:\n"); for(v1=0;v1 for(w1=0;w1 printf("%6d",p[v1][w1]);