算法模板:spfa
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<set>
#include<queue>
#include<vector>
using namespace std;
const int inf=0x7f7f7f7f;
const int NUM_NODE=310;
struct edge{ // 边的数据结构
int to;int weight;
edge(int t,int w):to(t),weight(w){}
};
vector<edge> e[NUM_NODE];
int dist[NUM_NODE];
bool spfa(int s){ // s是源点
memset(dist,inf,sizeof(dist)); // 距离初始化为正无穷
dist[s]=0; // 源点到自己距离为0
bool inqueue[NUM_NODE]; // 用来记录顶点是否入队
memset(inqueue,0,sizeof(inqueue));
int qtimes[NUM_NODE]; // 用来记录入队次数
memset(qtimes,0,sizeof(qtimes));
queue<int> q;
q.push(s);inqueue[s]=true;++qtimes[s]; // 将源点入队
int cur;
while(!q.empty()){ // while队列非空
cur=q.front();q.pop();inqueue[cur]=false; // 取出队首
for(edge i:e[cur]) // 对每一个队首邻接的顶点
if(dist[i.to]>dist[cur]+i.weight){ // 如果经过队首会让你更近一些
dist[i.to]=dist[cur]+i.weight; // 那么就更新距离
if(!inqueue[i.to]){
q.push(i.to);inqueue[i.to]=true;++qtimes[i.to]; // 入队
if(qtimes[i.to]>NUM_NODE)return false; // 入队次数>顶点数,出现负环
}
}
}
return true; // 没有负环
}
int main(){
ios::sync_with_stdio(false);
}
/*
SPFA可以处理负边,在稠密图里不如dijkstra。
复杂度是O(kE),k是每个点的平均进队次数。
1. 初始时,只有起点在队列中。
2. 遍历与起点相连的边,如果可以松弛就更新距离dist[],然后判断这个点在不在队列里,如果不在就入队标记。
3. 取出队首,取消标记,循环2-3步,直至队为空。
如何判断成环:
在储存边时,记录下每个点的入度,每个点入队的时候记录一次。
如果入队的次数大于这个点的入度,说明从某一条路进入了两次,即该点处成环。
如何判断负环:
一条最短路径最多通过所有顶点,即松弛n次,不可能从某些顶点绕好几圈。
因此,如果某个节点入队次数>n,则出现负环。
*/
算法模板:spfa的更多相关文章
- 最短路算法模板--SPFA
初见SPFA时,直接认成了优先队列优化的Dijkstra,经过几位大佬的指点,我终于明白了他们的差异. Dijkstra是保证已经出队过的点不再入队,SPFA是已经在队列中不再入队.比较起来,SPFA ...
- 最短路算法模板SPFA、disjkstra、Floyd
朴素SPFA(链表建边) #include <iostream> #include <cstdio> #include <cstring> #include < ...
- (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法模板的整理与介绍
这一篇博客以一些OJ上的题目为载体.整理一下最短路径算法.会陆续的更新... 一.多源最短路算法--floyd算法 floyd算法主要用于求随意两点间的最短路径.也成最短最短路径问题. 核心代码: / ...
- Bellman-ford算法、SPFA算法求解最短路模板
Bellman-ford 算法适用于含有负权边的最短路求解,复杂度是O( VE ),其原理是依次对每条边进行松弛操作,重复这个操作E-1次后则一定得到最短路,如果还能继续松弛,则有负环.这是因为最长的 ...
- 图论之最短路算法之SPFA算法
SPFA(Shortest Path Faster Algorithm)算法,是一种求最短路的算法. SPFA的思路及写法和BFS有相同的地方,我就举一道例题(洛谷--P3371 [模板]单源最短路径 ...
- 最短路问题的三种算法&模板
最短路算法&模板 最短路问题是图论的基础问题.本篇随笔就图论中最短路问题进行剖析,讲解常用的三种最短路算法:Floyd算法.Dijkstra算法及SPFA算法,并给出三种算法的模板.流畅阅读本 ...
- Bellman-Ford算法与SPFA算法详解
PS:如果您只需要Bellman-Ford/SPFA/判负环模板,请到相应的模板部分 上一篇中简单讲解了用于多源最短路的Floyd算法.本篇要介绍的则是用与单源最短路的Bellman-Ford算法和它 ...
- 匈牙利 算法&模板
匈牙利 算法 一. 算法简介 匈牙利算法是由匈牙利数学家Edmonds于1965年提出.该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法. 二分图的定义: 设G=(V,E)是一个 ...
- Tarjan 算法&模板
Tarjan 算法 一.算法简介 Tarjan 算法一种由Robert Tarjan提出的求解有向图强连通分量的算法,它能做到线性时间的复杂度. 我们定义: 如果两个顶点可以相互通达,则称两个顶点强连 ...
- hdu 2255 奔小康赚大钱--KM算法模板
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要 ...
随机推荐
- Wget命令解释
Wget主要用于下载文件,在安装软件时会经常用到,以下对wget做简单说明. 1.下载单个文件:wget http://www.baidu.com.命令会直接在当前目录下载一个index.html的文 ...
- 初步了解认识正则表达式(Regex)
如果你感到这篇文章对您有所帮助,那请您给我一个免费的赞吧QWQ! 如果想要深入理解什么是正则表达式,请购买教材<形式语言与自动机>,相信学完它之后一定会让你更加理解正则表达式! 1.你的同 ...
- redisson之分布式锁实现原理(三)
官网:https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95 一.什么是分布式锁 1.1.什么是分布式锁 分布式锁,即分布式系统中的锁 ...
- vue大型电商项目尚品汇(后台篇)day04
昨天太晚就没来得及更新,今天是spu管理界面,这个界面一共有三个界面需要切换,完成了两个界面,而且今天的难度在于最后两个章节,富有一定的逻辑性,当然中间也有很多需要注意的,比如ElementUI的照片 ...
- 封装环形加载进度条(Vue插件版和原生js版)
1.效果预览 2.用到的知识 主要利用SVG的stroke-dasharray和stroke-dashoffset这两个属性. 在看下面文章之前,你需要了解 <!DOCTYPE html> ...
- RPA微信机器人汇总
一.微信广告PDF对账单数据提取机器人 [机器人详情] 微信广告对账结算单为PDF文件,从每一期对账单文件中提取结算数据,统计成excel表格,便于与腾讯广告业务结算审核 [机器人步骤] 1.启动机器 ...
- 019(The XOR Largest Pair)(字典树)
题目:http://ybt.ssoier.cn:8088/problem_show.php?pid=1472 题目思路:异或是啥呀? 异或就是把两个数字变成位数相同的二进制在同位比较,相同为0,不同为 ...
- 图片64base转码与解码
场景一:图片转码成base64,传输,接收后解码成png等格式图片 import base64 # 读取图片,转换为base64编码格式 with open("F:\Archer\pictu ...
- SpringBoot自定义starter开发分布式任务调度实践
概述 需求 在前面的博客<Java定时器演进过程和生产级分布式任务调度ElasticJob代码实战>中,我们已经熟悉ElasticJob分布式任务的应用,其核心实现为elasticjob- ...
- 洛谷 P1714 切蛋糕 单调队列
这个题比较显然,要用前缀和来做.但只用前缀和是过不去的,会TLE,所以需要进行优化. 对于每个前缀和数组 b 中的元素,都可以找到以 b[i] 结尾的子段最大值 p[i],显然,最终的 ans 就是 ...