首页 > 编程语言 >SPFA最短路算法

SPFA最短路算法

时间:2022-11-14 20:23:33浏览次数:48  
标签:dist int 短路 SPFA 更新 st 队列 算法

Shortest Path Fastest Algorithm (spfa) 单源最短路、存在负权边

这个算法因为与 Bellman-Ford 算法比较相似,只是在它的算法的基础上进行了队列优化,因此也被嘲讽为“队列优化的贝尔曼福德”。

就是每次可以更新到一个节点的最短距离的时候,我们就更新它,并更新所有它能到达的子节点,直到没有节点需要被更新。

int n,m;
int h[N],ne[N],e[N],w[N],idx;  //w[]权重
int dist[N];  //距离
bool st[N];   //记录当前点是不是在队列当中,防止队列中存储重复的点!!!!!!!!!!!!!!!!!!!!1


int spfa()
{
    //初始化
    memset(dist, 0x3f, sizeof dist);
    dist[1]=0;

    //用队列来存储待更新的点的下标
    queue<int> q;
    q.push(1);
    st[1]=true;

    while(q.size())
    {
        int t=q.front();
        q.pop();

        st[t]=false;

        for(int i=h[t];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(dist[j]>dist[t]+w[i])
            {
                dist[j]=dist[t]+w[i];
                if(!st[j])
                {
                    q.push(j);
                    st[j]=true;
                }  
            }
        }
    }

    if(dist[n] == 0x3f3f3f3f)   return -1;
    return dist[n];

}

标签:dist,int,短路,SPFA,更新,st,队列,算法
From: https://www.cnblogs.com/-Rebecca/p/16890241.html

相关文章

  • 实验四:神经网路算法实验
    实验四:神经网络算法实验20大数据三班博客班级qiao_px学号201613336博客链接【实验目的】理解神经网络原理,掌握神经网络前向推理和后向传播方法;掌握神经......
  • Bellman-ford算法
    适用于存在负权边,题目要求最短路不超过k条边,还可以检测是否存在回路核心思想是松弛操作(枚举所有边)首先n次迭代,每一次循环所有边。我们这里用a,b,w表示存在一条从a走到b......
  • 【数据结构/C语言】编写实现这个双向栈tws的入栈操作Push(&tws, i ,e)和出栈操作的算
    假设以顺序存储结构实现一个双向栈,即在一维数组的存储空间中存在两个栈,它们的栈底分别设在数组的两个端点,栈顶指针分别指示栈顶元素的下一存储单元。试编写实现这个双向栈t......
  • 【数据结构/C语言】编写循环顺序队列结构相应的入队和出队算法
    如果希望循环顺序队列中的存储空间都能得到利用,可设置一个标志域变量tag,并以tag的值为0或1来区分队头指针和队尾指针相等时的队列状态是“空”还是“满”。试编写此结构相......
  • 【数据结构/C语言】试给出此循环队列的队满条件,并写出相应的入队和出队操作的算法
    假设将循环顺序队列定义为:以域变量rear和length分别指示循环顺序队列中队尾元素的位置和内含元素的个数,试给出此循环队列的队满条件,并写出相应的入队和出队操作的算法。提......
  • letcode算法--19.最大子数组和
    给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。方法一:动态规划classSolution......
  • 强化学习代码实战-06 Dueling DQN 算法
    引入优势函数A,优势函数A=状态动作价值函数Q-状态价值函数V。在同一状态下,所有动作的优势值为零。因为,所有的动作的状态动作价值的期望就是状态价值。实现代码:impor......
  • Johnson全源最短路
    Johnson通过另一种方法给每条边重新标注边权。新建一个虚拟结点0,向其他所有点连一条边权为0的边,用Bellman-Ford或SPFA算法求出0到其他所有点的最短路记为gpe[i],对于一条x->......
  • 哈希算法
    hash函数,通常用于将字符串映射到整数的函数,一般将值域映射到1e9或1e18以内,尽量避免哈希冲突并且便于比较。选取哈希进制base和模数mod,尽量选取质数,对于一个字符串s的哈希......
  • Tarjan算法
    tarjan求无向图割点,若x是根节点,则子树个数>1时x时割点;若x是非根节点,当ipt[x]<=low[y]时x是割点,说明y的子树无法通过非父子边回溯到x的祖先,那么删掉x,图将分裂成两个字图,即x......