【笔记】最短路——SPFA算法
##算法功能
找最短路(最长路?)
##算法思想
用一个节点k更新节点i到节点j的最短路
##邻接链表存储
基础而高效的图的存储方式
存的是单向边(无向边可以看成两条有向边)
##实现
维护节点i到源点s的最小值d[i]
用队列实现
维护队列z,
用visit[]记录一个点是否在队列
从源点开始进队列,每次弹出队头元素x,(标记visit[x]=0)
用它的最短路d[x]将与它相连的节点y的最短路d[y]更新
如果y不在队列(visit[y]==0),让y入队,记录(visit[y]=1)
直到队列为空,所有节点的d[]都已维护好
##判断负环
若图中存在负环,则更新时一定不断地让负环上的节点入队,负环上的点一定会无数次入队,最终死循环
所以我们记录一个点入队的次数sum[],sum[i]在每次i入队时++,如果sum[i]贼大,贼大,证明有负环
贼大到多大呢?贼大到2*m(m是边数)就肯定死循环了
反正就是不能比2*m大(一共m条边,假设都与节点i相连,则i最多入队m次(当然不可能所有边都让i走一遍)(老师让sum[i]和m*2比较,不知道为啥那么大
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <queue>
#define N 100010
#define M 100010
//复杂度上限m*n
//n个点,每个如m次 //正常nlogn //网格图贼慢
using namespace std; queue <int> z;
int d[N],len,visit[N],n,m; //采用结构体存图
struct edge
{
int x,y,k,next;
}a[M];
// 邻接链表存储
int first[M];
void ins(int x,int y,int k)
{
len++;
a[len].x=x;
a[len].y=y;
a[len].k=k;
a[len].next=first[x];
first[x]=len;
}
int sum[N]; int main()
{
cin>>n>>m;
memset(d,,sizeof(d));//63是billion(十亿)级别的10 6110 9567
int x,y,k;
for(int i=;i<=m;i++)
{
cin>>x>>y>>k;
ins(x,y,k);
ins(y,x,k);
}
int s;
cin>>s;//源点
z.push(s);
visit[s]=;
d[s]=; //******主体代码
while(!z.empty())
{
x=z.front();
for(int k=first[x];k;k=a[k].next)
{
y=a[k].y;
if(d[x]+a[k].k < d[y])
{
d[y]=d[x]+a[k].k;
if(!visit[y])
{
// sum[y]++;
z.push(y);//这是一个迭代的过程(老师说的,其实我不知道啥是迭代)
visit[y]=;
}
}
}
z.pop();
sum[x]++;
/*if(sum[x] > 2*m)//判断负环 有时会用到
{
printf("NO");
break;
}*/
visit[x]=;
}
//**********
for(int i=;i<=n;i++) cout<<d[i]<<" ";//得到所有节点到源点的最短路
return ;
}
【笔记】最短路——SPFA算法的更多相关文章
- 图论-单源最短路-SPFA算法
有关概念: 最短路问题:若在图中的每一条边都有对应的权值,求从一点到另一点之间权值和最小的路径 SPFA算法的功能是求固定起点到图中其余各点的的最短路(单源最短路径) 约定:图中不存在负权环,用邻接表 ...
- 图论算法(三) 最短路SPFA算法
我可能要退役了…… 退役之前,写一篇和我一样悲惨的算法:SPFA 最短路算法(二)SPFA算法 Part 1:SPFA算法是什么 其实呢,SPFA算法只是在天朝大陆OIers的称呼,它的正统名字叫做: ...
- 最短路-SPFA算法&Floyd算法
SPFA算法 算法复杂度 SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环. SPFA一般情况复杂度是O(m)最坏情况下复杂度和朴素 ...
- poj 3013 最短路SPFA算法
POJ_3013_最短路 Big Christmas Tree Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 23630 ...
- 最短路 spfa 算法 && 链式前向星存图
推荐博客 https://i.cnblogs.com/EditPosts.aspx?opt=1 http://blog.csdn.net/mcdonnell_douglas/article/deta ...
- 单源最短路——SPFA算法(Bellman-Ford算法队列优化)
spfa的算法思想(动态逼近法): 设立一个先进先出的队列q用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路 ...
- 单源最短路SPFA算法
$huaji^{233……}$模板:洛谷 P3371 #include<iostream> #include<algorithm> #include<cstdio> ...
- 洛谷 P1266 速度限制 最短路+SPFA算法
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 P1266 速度限制 题目描述 在这个繁忙的社会中,我们往往不 ...
- 洛谷 P1073 最优贸易 最短路+SPFA算法
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 P1073 最优贸易 题目描述 C国有 $ n $ 个大城市和 ...
随机推荐
- ACM北大暑期课培训第一天
今天是ACM北大暑期课开课的第一天,很幸运能参加这次暑期课,接下来的几天我将会每天写博客来总结我每天所学的内容.好吧下面开始进入正题: 今天第一节课,郭炜老师给我们讲了二分分治贪心和动态规划. 1.二 ...
- redux一些自习时候自己写的的单词
setState:设置状态 render:渲染,挂载 dispatchEvent : 派发事件 dispatch:分发,派遣:库里的一个方法,简而言之相当于一个actions和reducer监听方法更 ...
- 使用redis的zset实现高效分页查询(附完整代码)
一.需求 移动端系统里有用户和文章,文章可设置权限对部分用户开放.现要实现的功能是,用户浏览自己能看的最新文章,并可以上滑分页查看. 二.数据库表设计 涉及到的数据库表有:用户表TbUser.文章表T ...
- 一条SQL注入引出的惊天大案2:无限战争
前情回顾: 经过黑衣人和老周的合作,终于清除了入侵Linux帝国的网页病毒,并修复了漏洞.不曾想激怒了幕后的黑手,一场新的风雨即将来临. 详情参见:一条SQL注入引出的惊天大案 风云再起 小Q是L ...
- css写斜角
项目开发中遇到了这样的效果,百度了一波,可以使用css3的伪类实现: /*斜角公用*/1.外层的div加class='wrapper' 并需要设置相对定位 .wrapper:before { -moz ...
- hdfs/hbase 程序利用Kerberos认证超过ticket_lifetime期限后异常
问题描述 业务需要一个长期运行的程序,将上传的文件存放至HDFS,程序启动后,刚开始一切正常,执行一段时间(一般是一天,有的现场是三天),就会出现认证错误,用的JDK是1.8,hadoop-clien ...
- Epplus Excel 导入 MSSQL 数据库
效果: 下载EXE 源码
- 1.常用的cmd命令
dir => 查看当前目录下的所有文件夹 cd.. => 返回上一级目录 cd/ => 返回根目录 cd 文件夹 => 打开当前目录下指定的子 ...
- Django3.0.2学习踩坑记
配置文件settings.py相关: 新增app INSTALLED_APPS = [ 'polls.apps.PollsConfig', # 这个是新增的APP 'django.contrib.ad ...
- 小白学 Python 爬虫(42):春节去哪里玩(系列终篇)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...