HDU 2544 最短路(spfa详解)
来源:互联网 发布:天天有喜知画疗伤视频 编辑:程序博客网 时间:2024/06/05 00:14
最短路
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 47986 Accepted Submission(s): 21137
输入保证至少存在1条商店到赛场的路线。
2 11 2 33 31 2 52 3 53 1 20 0
32
lcy | We have carefully selected several similar problems for you: 1217 2112 1142 1548 1385
求最短路径的算法有许多种,除了排序外,恐怕是OI界中解决同一类问题算法最多的了。最熟悉的无疑是Dijkstra,接着是Bellman-Ford,它们都可以求出由一个源点向其他各点的最短路径;如果我们想要求出每一对顶点之间的最短路径的话,还可以用Floyd-Warshall。
SPFA是这篇日志要写的一种算法,它的性能非常好,代码实现也并不复杂。特别是当图的规模大,用邻接矩阵存不下的时候,用SPFA则可以很方便地面对临接表。每个人都写过广搜,SPFA的实现和广搜非常相似。
如何求得最短路径的长度值?
首先说明,SPFA是一种单源最短路径算法,所以以下所说的“某点的最短路径长度”,指的是“某点到源点的最短路径长度”。
我们记源点为S,由源点到达点i的“当前最短路径”为D[i],开始时将所有D[i]初始化为无穷大,D[S]则初始化为0。算法所要做的,就是在运行过程中,不断尝试减小D[]数组的元素,最终将其中每一个元素减小到实际的最短路径。
过程中,我们要维护一个队列,开始时将源点置于队首,然后反复进行这样的操作,直到队列为空:
(1)从队首取出一个结点u,扫描所有由u结点可以一步到达的结点,具体的扫描过程,随存储方式的不同而不同;
(2)一旦发现有这样一个结点,记为v,满足D[v] > D[u] + w(u, v),则将D[v]的值减小,减小到和D[u] + w(u, v)相等。其中,w(u, v)为图中的边u-v的长度,由于u-v必相邻,所以这个长度一定已知(不然我们得到的也不叫一个完整的图);这种操作叫做松弛。
(3)上一步中,我们认为我们“改进了”结点v的最短路径,结点v的当前路径长度D[v]相比于以前减小了一些,于是,与v相连的一些结点的路径长度可能会相应地减小。注意,是可能,而不是一定。但即使如此,我们仍然要将v加入到队列中等待处理,以保证这些结点的路径值在算法结束时被降至最优。当然,如果连接至v的边较多,算法运行中,结点v的路径长度可能会多次被改进,如果我们因此而将v加入队列多次,后续的工作无疑是冗余的。这样,就需要我们维护一个bool数组Inqueue[],来记录每一个结点是否已经在队列中。我们仅将尚未加入队列的点加入队列。
#include<stdio.h>#include<string.h>#include<queue>#include<algorithm>#define INF 0xfffffffusing namespace std;int map[1010][1010],dis[1010],vis[1010],n,m;void spfa(){int i,k;memset(vis,0,sizeof(vis));for(i=1;i<=n;i++)dis[i]=INF;dis[1]=0;queue<int>q;vis[1]=1;q.push(1); while(!q.empty()){k=q.front();q.pop();vis[k]=0;for(i=1;i<=n;i++){if(dis[i]>dis[k]+map[k][i]){dis[i]=dis[k]+map[k][i]; if(vis[i]==0)//判断这个点是否在队列里面,如果不在加入队列 { q.push(i); vis[i]=1; }}}}}int main(){while(scanf("%d%d",&n,&m),n+m){int i,j;for(i=0;i<=n;i++)for(j=0;j<=n;j++)map[i][j]=INF; while(m--){int a,b,c;scanf("%d%d%d",&a,&b,&c);if(c<map[a][b])map[a][b]=map[b][a]=c;}spfa();printf("%d\n",dis[n]);}}
- HDU 2544 最短路(spfa详解)
- HDU 2544-最短路(最短路spfa)
- HDU 2544 最短路(最短路/spfa)
- hdu 2544 最短路(最短路spfa)
- HDU 2544 最短路 (Dijkstra || SPFA)
- hdu 2544 最短路(dijkstra||spfa)
- hdu-2544-最短路(SPFA)
- hdu 2544 最短路(SPFA算法)
- HDU 2544 最短路(Spfa)
- hdu 2544 最短路(spfa)
- Spfa 最短路 HDU 2544
- hdu 2544 最短路-spfa
- hdu 2544 最短路 spfa
- HDU 2544 最短路 (SPFA)
- HDU 2544 最短路【SPFA】
- HDU 2544 最短路 SPFA
- hdu 2544——最短路 (spfa)
- HDU-#2544 最短路(Dijkstra、Floyd、Bellman-Ford、SPFA)
- Arcgis api for javascript 详细部署
- 用交换文件的方式添加交换分区
- 如何在ScrollView中嵌套ListView
- IOS 获取时间
- Android客户端性能优化(魅族资深工程师毫无保留奉献)
- HDU 2544 最短路(spfa详解)
- android:layout_gravity和android:gravity的区别
- /etc/fstab详解
- C#中base和this关键字
- 初探处理器体系结构及寻址模式
- bootstrap3.3 兼容IE8处理方法
- 模式识别相似性测度距离计算---马氏距离
- java基础题
- 每个软件开发人员必须知道的关于 Unicode 和字符集最小限度的知识(没有理由不知道!)