Dijkstra算法实现与分析

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Dijkstra’s算法设计与分析实验

1.Dijkstra’s算法:的实现。

注:本算法来自教材(英文版),在此就省略了,只给出具体实现的程序代码,采用Microsoft Visual C++ 6.0实现,并且图的存储结构为邻接表。

①本项目的组成结构如图所示

②各对应模块的功能如下:

asjacent(VNOde v,int a):判断二接点是否相邻。

belong(int A[],int n,int p): 判断一个元素是否在指定数组中。

dijkstra(Vnode G[],int n):求最短路径问题的函数。

length(Vnode v,int a): 找出二相邻接点的长度。

main():主函数。

min(int r[],int Y[],int n):找出最小的元素的下标.

shanchu(int A[],int sum,int p):删除数组中值为p的元素(覆盖).

③对应完整程序:

#include

#include

#define N 6 // 图的接点个数

typedef struct ANode

{ int adjvex;

struct ANode *nextarc;

int distance; //边的长度

}ArcNode;

typedef struct Vnode

{

ArcNode *firstarc;

}VNode;

int adjacent(VNode v,int a) //判断二接点是否相邻

{ ArcNode *arc=v.firstarc;

while(arc!=NULL)

{ if(arc->adjvex==a)

return 1;

arc=arc->nextarc;

}

return 0;

}

int length(VNode v,int a) //找出二相邻接点的长度

{ ArcNode *arc=v.firstarc;

while(arc!=NULL)

{ if(arc->adjvex==a)

return arc->distance;

arc=arc->nextarc;

}

return 0;

}

int min(int r[],int Y[],int n) //找出最小的元素的下标

{ int min=r[Y[0]],k=Y[0];

for(int i=1;i

if(r[Y[i]]

return k;

}

void shanchu(int A[],int sum,int p) //删除数组中值为p的元素(覆盖)

{ for(int i=0;i

{ if(p==A[i])

if(p!=A[sum-1])

{ for(int j=i;j

A[j]=A[j+1];

}

}

}

int belong(int A[],int n,int p) //判断一个元素是否在指定数组中

{ for(int i=0;i

if(p==A[i]) return 1;

return 0;

}

void dijkstra(VNode G[],int n)

{ int X[N]={0},Y[N-1],r[N],m=1,q=n-1; //m,q分别代表二数组中当前元素的个数ArcNode *arc;

for(int i=1;i

Y[i-1]=i;

r[0]=0;

for(int y=1;y

{ if(adjacent(G[0],y)) r[y]=length(G[0],y);

else r[y]=63535;

}

for(int j=0;j

{

y=min(r,Y,q);

m++;X[m-1]=y;

shanchu(Y,q,y);q--;

arc=G[y].firstarc;

while(arc!=NULL)

{ if(belong(Y,q,arc->adjvex) && (r[y]+length(G[y],arc->adjvex)adjvex]))

r[arc->adjvex]=r[y]+length(G[y],arc->adjvex);

arc=arc->nextarc;

}

}

for(i=0;i

cout<

cout<

}

void main(void)

{ VNode G[N];

ArcNode *p;

p=(ArcNode *)malloc(sizeof(ArcNode));

p->adjvex=2;p->distance=12;p->nextarc=NULL;

G[0].firstarc=p;

p=(ArcNode *)malloc(sizeof(ArcNode));

p->adjvex=1;p->distance=1;p->nextarc=G[0].firstarc;

G[0].firstarc=p; //建立好第1个链(头插法)

p=(ArcNode *)malloc(sizeof(ArcNode));

p->adjvex=3;p->distance=3;p->nextarc=NULL;

G[1].firstarc=p;

p=(ArcNode *)malloc(sizeof(ArcNode));

p->adjvex=2;p->distance=9;p->nextarc=G[1].firstarc;

G[1].firstarc=p; //建立好第2个链

p=(ArcNode *)malloc(sizeof(ArcNode));

p->adjvex=4;p->distance=5;p->nextarc=NULL;

G[2].firstarc=p; //建立好第3个链

p=(ArcNode *)malloc(sizeof(ArcNode));

相关文档
最新文档