2.14(学习总结)

一、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;//标记未标记过的点
                }
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值