最短路算法 -- SPFA模板

一、算法步骤

建立一个队列,初始时队列里只有起始点,再建立一个数组记录起始点到所有点的最短路径(该数组的初始值要赋为极大值,该点到它本身的路径赋为0,下面的模板中该数组为dist[])。然后执行松弛操作,用队列里有的点作为起始点去刷新到所有点的最短路,如果刷新成功且被刷新点不在队列中则把该点加入到队列最后。重复执行直到队列为空。

二、算法模板

 1 struct Edge
 2 {
 3     int s, e, dist;    //边的起点、终点、长度
 4
 5     Edge() {}
 6     Edge(int s, int e, int d) :s(s), e(e), dist(d) {}
 7 };
 8
 9 const int INF = 0x3f3f3f;
10 const int N = 100 + 10;
11 vector<Edge> v[N];   //使用邻接表存储图,v[i]存储与结点i邻接的结点
12 int dist[N];    //存储从起点到其余各点的最短路径
13 int visit[N];   //存储结点是否被访问过
14 int n;    //n为图中结点个数
15
16 void spfa(int s)  //求结点s到其余各点的最短路
17 {
18     queue<int> q;
19     memset(dist, INF, sizeof(dist));
20     memset(visit, 0, sizeof(visit));
21     q.push(s);
22     visit[s] = 1;
23     dist[s] = 0;
24
25     while (!q.empty())
26     {
27         int s = q.front();
28         q.pop();
29         visit[s] = 0;
30         for (int i = 0; i < v[s].size(); i++)
31         {
32             int e = v[s][i].e;
33             if (dist[e] > dist[s] + v[s][i].dist)
34             {
35                 dist[e] = dist[s] + v[s][i].dist;
36                 if (visit[e] == 0)
37                 {
38                     visit[e] = 1;
39                     q.push(e);
40                 }
41             }
42         }
43     }
44     printf("%d\n", dist[n]);
45 }

三、模板题

1、hdoj2544

时间: 2024-10-14 23:49:22

最短路算法 -- SPFA模板的相关文章

最短路之SPFA模板

一:邻接矩阵版本SPFA//如果要判断负环的话加一个记录入队的数组就行,当入队次数大于n的时候出现负环 int d[MAXN],vis[MAXN],w[MAXN][MAXN]; int n; void SPFA(int s) { fill(d,d+n,INF); d[s]=0; queue<int> q; q.push(s); while(!q.empty()) { int u=q.front(); q.pop(); for(int v=0; v<n; v++) { if(d[v]>

最短路算法(floyed+Dijkstra+bellman-ford+SPFA)

最短路算法简单模板 一.floyed算法 首先对于floyed算法来说就是最短路径的动态规划解法,时间复杂度为O(n^3) 适用于图中所有点与点之间的最短路径的算法,一般适用于点n较小的情况. Floyed算法有三层循环,循环的层次先后顺序也是比较重要的,分别为k ,i,j:因为dis[k][i][j]代表的是i节点到j节点的最短路如果中间经过节点k的话dis[k][i][j] =dis[k-1][i][k]+dis[k-1][k][j]:否则dis[k][i][j] = dis[k-1][i]

[ACM] 最短路算法整理(bellman_ford , SPFA , floyed , dijkstra 思想,步骤及模板)

以杭电2544题目为例 最短路 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路.N=M=0

模板C++ 03图论算法 1最短路之单源最短路(SPFA)

3.1最短路之单源最短路(SPFA) 松弛:常听人说松弛,一直不懂,后来明白其实就是更新某点到源点最短距离. 邻接表:表示与一个点联通的所有路. 如果从一个点沿着某条路径出发,又回到了自己,而且所经过的边上的权和小于0, 就说这条路是一个负权回路. 回归正题,SPFA是bellman-ford的一种改进算法,由1994年西安交通大学段凡丁提出.它无法处理带有负环的图,判断方法:如果某个点进入队列的次数超过N次则存在负环. SPFA的两种写法,bfs和dfs,bfs判别负环不稳定,相当于限深度搜索

蓝桥杯-最短路 (SPFA算法学习)

SPFA算法主要用来解决存在负边权的单源最短路情况(但不能有负环!!!)一个简单的方法判断是否有没有负环可以通过判断是否有一个节点是否频繁进出队列. 以下内容转自https://blog.csdn.net/xunalove/article/details/70045815 求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm. SPFA算法是西南交通大学段凡丁于1994年发表的. 从名字我们就可以看出,这种算法在效率上一定有过人之处. 很多时候,给定的

hdu 4568 spfa 最短路算法+旅行商问题

http://acm.hdu.edu.cn/showproblem.php?pid=4568 Problem Description One day, a hunter named James went to a mysterious area to find the treasures. James wanted to research the area and brought all treasures that he could. The area can be represented a

最短路算法 :Bellman-ford算法 &amp; Dijkstra算法 &amp; floyd算法 &amp; SPFA算法 详解

 本人QQ :2319411771   邮箱 : [email protected] 若您发现本文有什么错误,请联系我,我会及时改正的,谢谢您的合作! 本文为原创文章,转载请注明出处 本文链接   :http://www.cnblogs.com/Yan-C/p/3916281.html . 很早就想写一下最短路的总结了,但是一直懒,就没有写,这几天又在看最短路,岁没什么长进,但还是加深了点理解. 于是就想写一个大点的总结,要写一个全的. 在本文中因为邻接表在比赛中不如前向星好写,而且前向星效率并

SPFA最短路算法

SPFA:Shortest Path Faster Algoriithm 快速最短路径算法 SPFA的核心算法就是Bell-Ford算法.它使用一个队列或者一个栈来减少了Bell-Ford中不必要的松弛.可以处理负边和环的情况,他的使用比Dijstra更广泛.但是未经优化的SPFA算法时间复杂度不稳定,测试用例对它的影响较大.所以有的时候为了简单方便,我们直接使用Dijstra算法来解决. SPFA实现的过程非常类似于BFS.他们都是使用队列来维护,不同的是,BFS的每个顶点只入队一次,而SPF

POJ 2449 Remmarguts&#39; Date (第k短路 A*搜索算法模板)

Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 22412   Accepted: 6085 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, h