首页 > 编程知识 正文

c语言最短路径算法(数据结构图的最短路径例题)

时间:2023-05-05 06:01:47 阅读:68004 作者:3995

首先是单源最短路的问题,肯定是Dijkstra算法:

实现原理:

每当得到的最短路径点进入一个时,修正从其邻点到源的最短路径,逐个修正,最终得到所有的最短路径点。

实现代码:

# definemaxvex9# define infinity 65535 typedefintpatharc [ maxv ex ]/*包含最短路径下标的数组*/typedefintshortpathtable [ maxv ex ]//用于分别存储的voidshortestpath _ Dijkstra (mgraphyg,int v0,Patharc *P,ShortPathTable *D ) intv,w,k,min; int final[MAXVEX]; for(v=0; vG.numVertexes; v({final[v]=0; (d ) [v]=G.arc[v0][v]; (p ) [v]=0; () d ) [v0]=0; final[v0]=1; /*开始主循环,每个循环v0到某一点v的最短路径*/for(v=1; vG.numVertexes; v ) {min=INFINITY; for(w=0; wG.numVertexes; w () if (! final[w](*d ) [w]min ) {k=w; min=(d ) [w]; }}final[k]=1; for(w=0; wG.numVertexes; w () if (! final[w]ming.arc[k][w](d ) ) d ) [w]=ming.arc[k] ) w ); (p ) [w]=k; } }接下来是多源最短路的问题,即流动算法:

实现想法:

其实是相当暴力的算法,三重循环,进行遍历。

实现代码:

typedefintpathmatirx [ maxv ex ] [ maxv ex ]/*包含最短路径下标的数组*/typedefintshortpathtable [ maxv ex ] [ maxv ex ]/*指向每个点vG.numVertexes; v ) for(w=0; wG.numVertexes; w () (d ) [v][w]=G.matirx[v][w]; (p ) [v][w]=w; }for(k=0; kG.numVertexes; k ) for(v=0; vG.numVertexes; v ) for(w=0; wG.numVertexes; w ((if ) (d ) (v ) (w ) (d ) (v ) (k ) (w ) ) ) (w ) (v ) (k ) ) ) 65 (p ) [v][k] ) }}}}}最短路径的显示代码可以写为:

for(v=0; vG.numVertexes; v ) for(w=v1; wG.numVertexes; w () printf(v%d-v%dweight3360%d ),v,w,d(v ) ); k=P[v][w]; printf(path:%d ),v ); while(k!=w () printf(-%d ),k ); k=P[k][w]; }printf(-%d(n ),w ) ) printf ) (n ); }在这里请注意一点。 流动算法中的P[v][w]代表了从v到w的路径中从v开始的第一步。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。