最短路径 SPFA P3371 【模板】单源最短路径(弱化版)
P3371 【模板】单源最短路径(弱化版)
SPFA算法:
SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环。SPFA 最坏情况下复杂度和朴素 Bellman-Ford 相同,为 O(VE)。
SPFA和Dijkstra不同的是:
Dijkstra 是从一个点的所有出边中找到一个最短出边,用它来继续更新下边的点
SPFA 是用一个点的所有出边都更新它下面的点
更新之前把这个点存进队列
更新时把他拿出来,再把更新的出边终点(未入队的)入队
一直不断更新,直到队列为空
队列里存的是点
(下面有详细解释,在链式前向星以后)
head[---] 这里大小根据点数决定
记录存边的历史,存的是i点的最后一条出边(它经历了不断更新)
vis[---] 判断是否已存入队列
dis[---] 从起点开始到当前点的最短路径
num_edge 表示边的编号
这里要用链式前向星存图:
//以下为链式前向星存图
void addedge(int from,int to,int dis) //存储每一条边 :起点,终点,长度
{
num_edge++; //新建一条边
edge[num_edge].next=head[from]; //上一条出边
edge[num_edge].to=to;
edge[num_edge].dis=dis;
head[from]=num_edge; //记录最后一条出边
}
这里edge[1]=0,因为它是顶点1的第一条出边
edge[2]=1,edge[3]=2,
edge[5]=0,因为它是顶点5 的第一条出边
edge[7]=5
SPFA
默认起点是1
用到1就把它弹出
再用6更新5入队
再用3更新
直到队列为空
【代码】:
#include<bits/stdc++.h>
#include<queue>
using namespace std; const int inf=; int n,m,s;
int dis[],vis[],head[],num_edge; struct Edge
{
int next,to,dis;
}edge[]; //大小由边数决定
// to 目标点
// dis 权值
// next 该点的上一条出边 queue<int>q;
//以下为链式前向星存图
void addedge(int from,int to,int dis) //存储每一条边 : 起点,终点,长度
{
num_edge++; //新建一条边
edge[num_edge].next=head[from]; //上一条出边
edge[num_edge].to=to;
edge[num_edge].dis=dis;
head[from]=num_edge; //记录最后一条出边
} void spfa()
{
for(int i=;i<=n;i++)
{
dis[i]=inf; //初始化最大值
vis[i]=; //都不入队
}
dis[s]=;
vis[s]=;
q.push(s); //把起点S入队
while(!q.empty())
{
int u=q.front(); //当前起点
q.pop(); //用就弹出
vis[u]=; //弹出后记录为不在队列
for(int i=head[u];i;i=edge[i].next) //遍历起点的所有出边
{
int v=edge[i].to; //当前终点
if(dis[v]>dis[u]+edge[i].dis)
//如果【起点到当前终点的距离】>【起点到当前起点的距离+当前距离与当前终点距离】
//那就更新为更小距离
{
dis[v]=dis[u]+edge[i].dis;
if(!vis[v]) //未入队的当前终点入队
{
q.push(v);
vis[v]=;
}
}
}
}
} int main()
{
scanf("%d%d%d",&n,&m,&s);
for(int i=;i<=m;i++)
{
int u,v,w;
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 ;
}
最短路径 SPFA P3371 【模板】单源最短路径(弱化版)的更多相关文章
- luogu P3371 & P4779 单源最短路径spfa & 最大堆优化Dijkstra算法
P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出 ...
- 【洛谷 p3371】模板-单源最短路径(图论)
题目:给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 解法:spfa算法. 1 #include<cstdio> 2 #include<cstdlib> 3 #in ...
- [模板]单源最短路径(Dijkstra)
如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 主要还是再打一遍最短路,这种算法我用的不多... #include<bits/stdc++.h> using namesp ...
- 单源最短路径(dijkstra算法)php实现
做一个医学项目,当中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路例如以下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么( ...
- 图->最短路径->单源最短路径(迪杰斯特拉算法Dijkstra)
文字描述 引言:如下图一个交通系统,从A城到B城,有些旅客可能关心途中中转次数最少的路线,有些旅客更关心的是节省交通费用,而对于司机,里程和速度则是更感兴趣的信息.上面这些问题,都可以转化为求图中,两 ...
- 洛谷 P3371 【模板】单源最短路径(弱化版) 题解
P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出 ...
- P3371 【模板】单源最短路径(弱化版)(Dijkstra算法)
题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三 ...
- 洛谷P3371 【模板】单源最短路径
P3371 [模板]单源最短路径 282通过 1.1K提交 题目提供者HansBug 标签 难度普及/提高- 提交 讨论 题解 最新讨论 不萌也是新,老司机求带 求看,spfa跑模板40分 为什么 ...
- 洛谷 P3371 【模板】单源最短路径
P3371 [模板]单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出 ...
随机推荐
- (89)Wangdao.com第二十二天_JavaScript 属性
属性 属性本身是一个对象(Attr 对象) Element.attributes 返回一个类似数组的动态对象,成员是该元素标签的所有属性节点对象 属性的实时变化都会反映在这个节点对象上. 其他类型的 ...
- MyISAM和Innodb区别,为什么?
事务支持 MyISAM不支持事务,而InnoDB支持. InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度, 所以最好是把多条SQL语句显 ...
- Python练手例子(8)
43.模仿静态变量(static)另一案例. 程序分析:演示一个python作用域使用方法. #python3.7 class Num: nNum = 1 def inc(self): self.nN ...
- 秒杀ecshop的前台写shell 0day
ECSHOP号称最大的开源网店系统,官方是这样介绍它的:“ECShop网店系统是一套免费开源的网上商店软件,无论在稳定性.代码优化.运行效率.负载能力.安全等级.功能可操控性和权限严密性等方面都居国内 ...
- python2和python3共存时,设置默认python为python3
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100 sudo update-alternati ...
- C#获取本周五日期字符串
using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using ...
- 中国省份毗邻关系JSON数据[相邻省份][所辖市级信息][行政区划]
最近做一个需求, 需要一份每个省份相邻[毗邻]的省份信息,这里整理了一版. json 数据,结构大致这样子的. [ { "id": 7, "name": &qu ...
- Ultimate Facebook Messenger for Business Guide (Feb 2019)
Ultimate Facebook Messenger for Business Guide (Updated: Feb 2019) By Iaroslav Kudritskiy November 2 ...
- 记一次mariadb升级故障
由于做mariadb集群,将版本从自带的5.5升级到10.0.3,升级成功后发现起不来 查journal log,只有一行warning can’t create test file /var/lib ...
- Python Flask Restful
Flask Restful 1.flask restful 在flask基础上进行一些封装,主要用于实现restful接口 2.restful的理解 1)URI(统一资源标识符):每一个URI代表一 ...