数据结构:单元最短路径,Dijkstra算法_实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;jvexnum;j++) //依次搜索VI的每个邻接点

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;jvexnum;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;jvexnum;j++){ //依次搜索VK的每个可能的邻接点if(k!=j&&G->arcs[k][j].adj!=INFINITY &&!visited[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(ivexnum){

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;vvexnum;++v){

final[v]=0; //设置顶点已求得的最短路径为0

d[v]=G->arcs[v0][v].adj;

for(w=0;wvexnum;++w)

p[v][w]=0; //设空路径

if(d[v]

p[v][v0]=1; //标记路径顶点

p[v][v]=1;

}

}

printf("\nfinal[]:"); //打印初始状态

for(v1=0;v1vexnum;++v1)

printf("%6d",final[v1]);

printf("\n\n d[]:");

for(v1=0;v1vexnum;++v1)

printf("%6d",d[v1]);

printf("\n\np[][]:\n");

for(v1=0;v1vexnum;++v1){

for(w1=0;w1vexnum;++w1)

printf("%6d",p[v1][w1]);

putchar('\n');

}

d[v0]=0;

final[v0]=1; //初始化V0属于S

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

min=INFINITY;

for(w=0;wvexnum;++w)

if(!final[w])

if(d[w]

v=w; //最小值下标

min=d[w];

}

final[v]=1; //将V加入S

for(w=0;wvexnum;++w)

if(!final[w]&&(min+G->arcs[v][w].adj

d[w]=min+G->arcs[v][w].adj;

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

p[w][j]=p[v][j];

p[w][w]=1;

}

printf("\nfinal[]:"); //打印中间结果,跟踪数据变化

for(v1=0;v1vexnum;++v1)

printf("%6d",final[v1]);

printf("\n\n d[]:");

for(v1=0;v1vexnum;++v1)

printf("%6d",d[v1]);

printf("\n\np[][]:\n");

for(v1=0;v1vexnum;++v1){

for(w1=0;w1vexnum;++w1)

printf("%6d",p[v1][w1]);

相关文档
最新文档