【图论】最短路问题之spfa
写在算法前面:
前向星存图(一个神奇的超越邻接矩阵的存在)
首先讲一下需要定义的一些东西??
1.head数组:head[点数]:head[i]表示以当前点i为起点的最后一条边(这里的最后指的是编号【我们按输入顺序给边编一个号】)。

这个图即为head[1]=4,表示以1为起点的边的最后一条是点1—>点5编号为4的边;
2.num_edge,表示边的总个数;
3.结构体:
struct Edge{
int next,to,dis;
}edge[边数];
这里,edge[i].next表示上一条以i为起点的边:
:
还是上面那个图,这里edge[4].next=3;
edge[i].to表示这条边i的终点;
edge[i].dis表示这条边的权值;
存图
void addedge(int from,int to,int dis){
num_edge++;//因为存入一条边,总边数+1;
edge[num_edge].next=head[from];//新存入一条以from为起点的边,之前的以from为起点的最后一条边变成了新边的上一条边
edge[num_edge].to=to;//存终点
edge[num_edge].dis=dis;//存权值
head[from]=num_edge;//存入一条以from为起点的边,那么现在以from为起点的最后一条边就是新存入的边
}
提醒:如果要存的是无向图,进行程序时应该:addedge(from,to,dis),addedge(to,from,dis)各跑一遍,所开空间也要*2;
大概是讲完了链式前向星存图;
spfa
算法思想:
1.运用队列的思想,先把起点入队,更新起点能够到达的点,更新这些点到起点的伪最短路(因为可能还有更短情况)然后把得到更新的点中不在队列里的加入队列,以便更新其他点。
2.当前更新的是伪最短路即可能会有更优情况
eg:起点是1,1到6距离为7,加入队列dis[6]=7,而1到7距离为2,7到6距离为3,会将dis[6]更新为2+3=5。所以一遍一遍查,最后将会是最短路。
时间复杂度大约是O(ke),稀疏图中k约等于2,但是毒瘤数据会把复杂度卡成O(nm);
spfa在存图基础上再开vis[点数]查询某个点是否已经在队列里,避免重复入队(请注意,是是否在队列里 队列里 队列里)
dis[点数]用来存某个点到起点的最短路;
以洛谷p3371【模板】单源最短路径(弱化版) 为例纸(标准的过不去qwq)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue> using namespace std; const int inf=;//题目要求的初始值 queue <int> q;//定义一个队列q
int n,m,s;
int head[],num;
int vis[],dis[]; struct Edge{
int next,to,dis;
}edge[]; void addedge(int from,int to,int dis){//加边
num++;
edge[num].next=head[from];
edge[num].to=to;
edge[num].dis=dis;
head[from]=num;
} void spfa(){
for(int i=;i<=n;i++){//首先初始化,将所有点的dis赋值为2147483647,所有点都不在队列里,vis为0
dis[i]=inf;
vis[i]=;
}
q.push(s);//把起点入队
dis[s]=;//起点到起点,最短路为0
vis[s]=;//入队了,vis变为1
while(!q.empty()){//开始循环
int u=q.front();
q.pop();//把队首元素出队
vis[u]=;//出队了,vis重置为0(因为可能还有更近的下次还能循环到)
for(int i=head[u];i;i=edge[i].next){//遍历以u为起点的所有遍
int v=edge[i].to;//v为终点
if(dis[v]>dis[u]+edge[i].dis){//如果之前的最短路比由u点出发再”拐弯“的点的要大,显然他不是最短,更新他
dis[v]=dis[u]+edge[i].dis;
if(!vis[v]){//如果终点不在队列里,入队
q.push(v);
vis[v]=;
}
}
}
}
} int main(){
scanf("%d%d%d",&n,&m,&s);
int u,v,w;
for(int i=;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);//输入起点终点权值
addedge(u,v,w);//加边
}
spfa();//核心
for(int i=;i<=n;++i)
{
if(i==s) printf("0 ");
else printf("%d ",dis[i]);
}
return ;
}
end-
【图论】最短路问题之spfa的更多相关文章
- 图论最短路——spfa
今天开始图论的最短路的最后复习,今天自己手打spfa虽然看了一眼书,但是也算是自己打出来的,毕竟很久没打了,而且还是一遍a代码下来15min左右就搞完了,成就感++.所以呢来篇博客记录一下. 香甜的黄 ...
- 【bzoj2330】: [SCOI2011]糖果 图论-差分约束-SPFA
[bzoj2330]: [SCOI2011]糖果 恩..就是裸的差分约束.. x=1 -> (A,B,0) (B,A,0) x=2 -> (A,B,1) [这个情况加个A==B无解的要特 ...
- Matlab 图论最短路问题模型代码
最短路问题的基本内容 最短路问题研究的是,在一个点与点之间连接形成的网络图中,对应路径赋予一定的权重(可以理解为两点之间的距离),计算任意两点之间如何和走,路径最短的问题.在这里的距离可以理解成各种两 ...
- 图论最短路径算法——SPFA
为了不要让太多人被害,我还是说一下这种算法,它实际上很简单,但被人讲着讲着绕晕了. 主要思想 有人说,SPFA是Bellman-Ford的队列优化.这个算法我也懂了,但是还没试过.我不管是什么算法的优 ...
- 图论--最短路--SPFA
SPFA算法(shortest path faster algorithm)算法是西南交通大学段凡丁于1994年发表的,它在Bellman-ford算法的基础上进行了改进,使其在能够处理待负权图的单元 ...
- 图论--最短路--SPFA模板(能过题,真没错的模板)
[ACM常用模板合集] #include<iostream> #include<queue> #include<algorithm> #include<set ...
- 【uva 658】It's not a Bug, it's a Feature!(图论--Dijkstra或spfa算法+二进制表示+类“隐式图搜索”)
题意:有N个潜在的bug和m个补丁,每个补丁用长为N的字符串表示.首先输入bug数目以及补丁数目.然后就是对M个补丁的描述,共有M行.每行首先是一个整数,表明打该补丁所需要的时间.然后是两个字符串,第 ...
- 【五一qbxt】day5 图论
图论 学好图论的基础: 必须意识到图论hendanteng xuehuifangqi(雾 图 G = (V,E) 一般来说,图的存储难度主要在记录边的信息 无向图的存储中,只需要将一条无向边拆成两条即 ...
- Codevs 1183 泥泞的道路
1183 泥泞的道路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路 ...
随机推荐
- Linux程序性能分析和火焰图
Linux程序性能分析和火焰图 Linux程序的性能分析工具数量比较多,涉及到整个操作系统的方方面面,可能是开源的原因吧,相对于Windows来说丰富太多.其中应用分析性能方面Dtrace, Syst ...
- [PHP] 解决人人商城收银台不能上传图片问题
反正网上一大堆,也不知道哪个版本有修复,反正我的没有修复. 问题报错:ReferenceError: angular is not defined 解决如下: 修改文件:addons/ewei_sho ...
- Python练习--普通函数与递归函数求阶乘
'''Created on 2018年10月28日递归函数示例:阶乘'''def my_fun_example1(n): ''' 非递归函数求阶乘示例 ''' result = ...
- Objective-C RunTime 学习笔记 之 消息转发流程
1) 当向某个对象发送消息时,先从cache(cache_t)中查找方法对象(method_t),如果找到则进行回调:否则通过查找对象的类(元类)定义中方法列表,一直追溯到NSObject, 如果找到 ...
- Redis4.0 之持久化存储
redis如果提供缓存服务,可以关闭所有持久化存储,如此一来redis重启后所有数据会丢失 开启rdb或aof持久化存储,能把redis中的数据持久化到磁盘中. rdb和aof对性能都有影响,所以建议 ...
- 轻量级集群管理软件-Ansible
ansible概述和运行机制 ansible概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具, 它用Python写成,类似于saltstack和Puppet,但是有一个不同 ...
- JQ得到当前登录城市和天气
$(function () { findWeather(); }); function findWeather() { var cityUrl = 'http://int.dpool.sina.com ...
- spring-boot 参考链接
http://blog.csdn.net/jsu_9207/article/details/66472096 http://blog.csdn.net/lu1005287365/article/det ...
- 搭建本地yum仓库(centos 7.5)
1. 保留下载的软件包 [root@zabbix-server01 ~]# vim /etc/yum.conf keepcache=1 #开启后下载的软件都会保存到本地 2.将软件进行下载,并将所有r ...
- CAN双机通讯调试小结(SJA1000与MCP2515通讯)
2011-12-07 21:36:02. 效果图: 1,51的SJA1000自收自发测试完成,见上一篇小结. 2,SJA1000自测完成后,再自测MCP2515就非常容易.主要是设置工作模式为回环模式 ...