最短路径算法及代码实现资料下载.pdf
- 文档编号:16087219
- 上传时间:2022-11-19
- 格式:PDF
- 页数:5
- 大小:243.59KB
最短路径算法及代码实现资料下载.pdf
《最短路径算法及代码实现资料下载.pdf》由会员分享,可在线阅读,更多相关《最短路径算法及代码实现资料下载.pdf(5页珍藏版)》请在冰豆网上搜索。
diss=0;
for(longi=1;
i=n;
i+)min=infi;
for(longj=1;
j=n;
j+)if(!
usedj&
disj!
=-1&
disjmin)min=disj;
next=j;
if(min!
=infi)usednext=true;
jmapnextj+disnext|disj=-1)disj=mapnextj+disnext;
returndise;
/ByStansovoidDijkstra()for(inti=1;
i+)disi=map1i;
intk;
for(inti=1;
in;
i+)inttmin=maxint;
for(intj=1;
jdisj)tmin=disj;
k=j;
usedk=1;
j+)if(disk+mapkjdisj)disj=disk+mapkj;
printf(%d,disn);
/*求1到N的最短路,disi表示第i个点到第一个点的最短路ByPing*/编辑Floyd-Warshall算算法法详细介绍Floyd是计算每对点间最短路径(APSP)的经典算法。
时间复杂度是雷打不动的O(n3)for(intk=1;
k=n;
k+)for(inti=1;
i+)for(intj=1;
j+)if(mapik!
=maxint&
mapkj!
=maxint)if(mapik+mapkjmapij)mapij=mapik+mapkj;
/*maxint为极大值表示不连通ByPing.*/编辑Bellman-Ford算算法法详细介绍Bellman-Ford主要是用于赋权图。
Bellman-Ford算法即标号修正算法。
实践中常用到的方法通常是FIFO标号修正算法和一般标号修正算法的Dequeue实现。
前者最坏时间复杂度是O(nm),是解决任意边权的单源最短路经问题的最优强多项式算法。
也可以用这个算法判断是否存在负权回路.SPFA算法SPFA就是bellmanford的一种实现方式。
SPFA算法就是上面说的FIFO标号修正算法,请参见网络流:
理论、算法与应用。
SPFA程序:
/SPFA(邻接矩阵)详细注释#include#defineINFINITY999999999usingnamespacestd;
longmap30003000=0;
/mapij邻接矩阵longqueue30000=0;
/queuei队列longlink30003000=0;
/linki0i点的出度linkiji点的第j条边指向longdist3000=0;
/distii点到起点距离boolused3000=0;
/usedii点是否在队列中longnode,edge,start,end;
voidspfa(longs)/s为当前起点longleft,right,now,nxt;
/now是当前队列头结点for(longi=0;
i=node;
i+)disti=INFINITY;
dists=0;
/将起点到起点距离设为0left=right=1;
queueleft=s;
/将起点入队useds=true;
while(left=right)now=queueleft;
idistnow+mapnownxt)/如果起始点到当前节点的第i个指向结点的距离起始点到当前节点的距离+当前节点到当前节点到当前节点的第i个指向结点的距离distnxt=distnow+mapnownxt;
/更新始点到当前节点的第i个指向结点的距离if(!
usednxt)/若当前节点的第i个指向结点不在队列中,就将其加入队列queue+right=nxt;
usednxt=true;
usedleft+=false;
/将当前节点出队return;
intmain()cinnodeedgestartend;
longnode1,node2,val;
inode1node2val;
mapnode1node2=mapnode2node1=val;
linknode10+;
linknode1linknode10=node2;
linknode20+;
linknode2linknode20=node1;
spfa(start);
coutdistend;
/输出起始点到终点的最短距离system(pause);
/ByStansovoidspfa()intt,p;
queuecl=1;
while(clop)intp=queuecl+;
for(t=headp0;
t!
=0;
t=listt.next)if(wayp!
wayp+listt.wwaylistt.r)waylistt.r=wayp+listt.w;
queueop+=listt.r;
printf(%d,wayn);
/*queue为优先队列,链表存图(list)byPing.*/*用这种方法存在队列里面很浪费空间,如果spfa退化到Bellman-Ford的复杂度之后,但是我们发现,在队列中的有效元素不可能多于图的节点总数,所以,我们可以用循环队列来存图,具体方法自己琢磨一下。
大致是把移动首尾指针的l+,r+替换成l=(l+1)%(n+1)队列的状态改为l!
=r*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 路径 算法 代码 实现