其中,vertex——顶点字段,存放顶点序号;
cost——表头顶点到该顶点之边上的权值;
link——连接同一链中的下一个顶点。
采用数组 dist[j](0≤j≤n-1)存放从源点 v0 到顶点 vj 的最短路径长度,dist[0]=0,如果源
点 v0 到顶点 vx 无通路,则 dist[x]=max(计算机允许的最大值)。
采用 n-1 个数组分别存放源点 v0 到其余 n-1 个顶点之最短路径上的顶点(序号)。采
用数组 S 指示已找到最短路径的顶点。S[j]=0 表示顶点 j 不在数组中,S[j]=1 表示顶点 j 在
数组中(0≤j≤n-1)。
初始状态时,集合 s 中只包含源点,设为 v0,然后不断地从集合 T 中选择到源点 v0
路径长度最短的结点 u 加入到集合 s 中,集合 s 中每加入一个新的结点 u 都要修改从源点
v0 到集合 T 中剩余结点的当前最短路径长度值,集合 T 中各结点的新的当前最短路径的长
度值,为原来的最短路径的长度值与从源点过结点 u 到达该结点的路径长度中的最小者。
此过程不断地重复,直到集合 T 中的结点全部加入到集合 s 中为止。
总体来说,本程序设计相对比较简单,主要包括四个功能模块:
主调函数、建图函数 、求最短路径函数 、输出函数。
下面分别给予介绍:
主调函数
main()
{
void bulidalgraph(algraph *g);
void shortpath(algraph *g,char ch); //求从该节点出发到达各个路径的最短路径
void putpath(algraph *g,int i); //输出路径
int locatvex(algraph *g,char ch);
algraph g;
arcnode *p;
int i;
char ch;
int tag=1;
bulidalgraph(&g);
for(i=0;i<g.vexnum;i++)
{
for(p=g.vertices[i].firstarc;p;p=p->nextarc)
printf("%c,%c ",g.vertices[i].data,g.vertices[p->adjvex].data);
printf("\n");
}
评论2