一、spfa算法(最短路径)
该算法是利用优先队列实现的,去掉一些无用的松弛操作,用队列来维护松弛造作的点,与bfs有些相似,那么松弛一般是怎样实现的呢?
松弛操作就是判定是否dis[j]>dis[i]+map[i][j],如果成立,那么就将dis[j]减小到dis[i]+map[i][j],否则不动,那么接下来我们再由图慢慢理解整个过程吧。

我们首先要将dis数组初始化,使dis数组里面的每个元素都等于无穷大(这里用max来代替),然后再将源点变为0,因为使要从源点开始的

接下来开始入队,先将源点入队

然后再将源点出队,表示要用到这个点,然后将出队的这个所能连接的点都入队,同时将dis数组根本更新


接下里继续出队,也就是4,那么接下来更新数组为


因为4没有与任何点连接,因此dis数组不变,接下来出队3,那么数组更新为


那么接下来继续上面的操作,那么最终dis数组为

代码实现
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int inf = 99999999;
const int maxx = 1000;
int dis[maxx];
bool vis[maxn];
struct node
{
int x;
int s;
};
vector<node>mp[maxx];
void spfa(int x)
{
queue<int>v;
vis[x] = 1; v.push(x); dis[x] = 0;
while (!v.empty()) {
int q = v.front();
v.pop(); vis[q] = 0;
for (int i = 0; i < mp[q].size(); i++) {
if (dis[mp[q][i].x] > dis[q] + mp[q][i].s) {
dis[mp[q][i].x] = dis[q] + mp[q][i].s;//更新最短路径。
if (!vis[mp[q][i].x]) {//是在更新新的值条件里面判断,一定特别注意这点
v.push(mp[q][i].x);
vis[mp[q][i].x] = 1;//标记未标记过的点
}
}
}
}
}