【笔记】最短路——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 $ 个大城市和 ...
随机推荐
- 小技巧(2) 查询自己博客的SEO(如果违规,请先提醒)
今天,教大家查看自己博客的SEO. 首先,上网站http://seo.chinaz.com/ 接着,在网页输入框中输入自己博客地址(带后面路径,不是cnblogs.com这样的,类似https://w ...
- a:visited不起作用的原因解析
目前大多数的网站都很少会出现"一个超链接被点击后改变其颜色"的需求,但也还是有一部分网站有这样的实际需求,也是为了能够让用户更容易区分哪些标题是被点击访问过了,这类需求大多在新闻类 ...
- JUnit 5和Selenium基础(二)
使用Selenium内置的PageFactory实现页面对象模式 在这一部分中,将通过Selenium的内置PageFactory支持类来介绍Page Object模式的实现.PageFactory提 ...
- Oozie任务调度框架详解及使用简介(一)
摘要:个人最近一段时间一直在使用oozie,从刚开始的各种别扭到现在越来越觉得有意思的情况下,想整理一下关于oozie的认知,整理出来一个oozie系列,本来市面上关于oozie的资料就比较少,希望写 ...
- python的list()函数
list()函数将其它序列转换为 列表 (就是js的数组). 该函数不会改变 其它序列 效果图一: 代码一: # 定义一个元组序列 tuple_one = (123,','abc') print( ...
- 七种武器:JavaScript 新特性闪亮登场
JavaScript(或ECMA Script) 是一门不断发展的语言,有许多关于如何前进的建议和想法.TC39(技术委员会39)是负责定义JS标准和特性的委员会,今年他们非常活跃.以下是目前处于&q ...
- 动态内存分配(C++)
C++中的动态内存分配 C++中通过new关键字进行动态内存分配 C++中的动态内存申请是基于类型进行的 delet关键字用于内存释放 //变量申请 Type*pointer = new Type; ...
- 转:详解G1垃圾收集器
G1垃圾收集器入门 说明 concurrent: 并发, 多个线程协同做同一件事情(有状态) parallel: 并行, 多个线程各做各的事情(互相间无共享状态) 参考: What’s the dif ...
- 2019 牛客国庆集训day1 2019 点分治
题目链接:https://ac.nowcoder.com/acm/contest/1099/I 点分治,计算路径数的时候,先将每个点到根的距离模2019,计算的时候就可以O(n)求出数目,对于模201 ...
- .NetCore自定义WebAPI返回Json的格式大小写的三种方式
.NetCore的Controller/WebAPI可以帮我们将返回结果自动转换为Json格式给前台,而且可以自由设定格式(大写.小写.首字母大写等),我总结了三种方法,对应三种灵活度,供大家参考 ( ...