【笔记】最短路——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 $ 个大城市和 ...
随机推荐
- 使用iview遇到问题记录总结
1.iview设置日期不可用,设置开始开始时间早于结束时间 官网示例,设置今天之前不可选,但是不能识别thisdisabledDate (date) { return date && ...
- 人群密度检测MCNN+CSRnet
MCNN(简单理解): 三列卷积神经网络,分别为大中小三种不同尺度的卷积核,表示为L列(使用大尺度卷积核: 9*9, 7*7, 7*7,7*7), M(使用中等尺度卷积核: 7*7, 5*5, 5*5 ...
- Python中url标签使用详解
url标签: 1.在模板中,我们经常要使用一些url,实现页面之间的跳转,比如某个a标签中需要定义href属性.当然如果通过硬编码的方式直接将这个url固定在里面也是可以的,但是这样的话,对于以后进行 ...
- LoopBox 用于包装循环的盒子
/******************************************************* * * 作者:朱皖苏 * 创建日期:20180608 * 说明:此文件只包含一个类,具 ...
- 重拾c++第三天(6):分支语句与逻辑运算符
1.逻辑运算符 && || ! 2.关系运算符优先级高于逻辑运算符 3.cctype库中好用的判断 4. ?:符号用法: 状态1?结果1:结果2 5.switch用法: switch ...
- Python第一个请求接口
1.普通get请求 import requests import json login_res=requests.post(url='http://joy.web.com:8090/login',da ...
- EasyExcel 自定义单元格式的问题。
最近在做一个关于性能测试管理系统,一个新的需求,需要导出测试报告,直接使用了ali的封装的EasyExcel,但是在复杂头与一些样式,就缺少了自定义的灵活性,在官方demo中没有找到很好的解决方法. ...
- minikube 设置CPU和内存
安装minikube之后,第一次sudo minikube start 时,设置参数--cpus int --memory int . 如果需要更改设置,需要将缓存文件$HOME/.minikube ...
- Activiti脚本任务(ScriptTask)
Activiti脚本任务(ScriptTask) 作者:Jesai 你一直问为什么到不了远方,请停下数数你的脚步,是不是还没迈开腿 对于没有接触过groovy脚本语言的人来说,可能比较难使用 应用场景 ...
- [bzoj4571] [loj#2016] [Scoi2016] 美味
Description 一家餐厅有 \(n\) 道菜,编号 \(1\)...\(n\) ,大家对第 \(i\) 道菜的评价值为 \(ai\)( \(1 \leq i \leq n\) ).有 \(m\ ...