最短路算法 -- 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
", dist[n]);
45 }

三、模板题

1、hdoj2544

原文地址:https://www.cnblogs.com/sench/p/7979450.html