最短路径 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,分别表示点的个数.有向边的个数.出 ...
随机推荐
- 03_ if 练习 _ little2big
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- Android常用的工具类SharedPreferences封装类SPUtils
package com.zhy.utils; import java.lang.reflect.InvocationTargetException; import java.lang.reflect. ...
- IP协议号 IP首部中有8位协议号,用于指明IP的上层协议.
IP协议号 IP首部中有8位协议号,用于指明IP的上层协议. 0 HOPOPT IPv6 逐跳选项 1 ICMP Internet 控制消息 2 IGMP Internet 组管理 3 GGP 网 ...
- 复制pdf文字出来是乱码
PDF文件复制文本为乱码 - longzhinuhou的博客 - CSDN博客 https://blog.csdn.net/longzhinuhou/article/details/83758966 ...
- CITS1401 Computational Thinking with Python
Department of Computer Science and Software EngineeringCITS1401 ComputationalThinking with PythonPro ...
- MFC 修改标题
1. Overwrite CMainFrame::PreCreateWindow. Clear the style FWS_ADDTOTITLE cs.style &= ~(LONG)FWS_ ...
- mysql 字符集
mysql -u root -p 输入密码进入mysql show variables like 'character%'; --显示字符集,像这样 \q退出mysql, 更改mysql配置文件 vi ...
- ADB——keyevent命令
基本格式 adb shell input keyevent xxx # xxx为具体操作对应的数字 keycode 官方 KEYCODE 链接:戳这里 0 KEYCODE_UNKNOWN 未知按键 1 ...
- Chrome浏览器添加控件
1. 添加user agent swithcher模拟浏览器内核 方法: 下载user agent switcher后,打开谷歌浏览器,先复制chrome://extensions/ 到浏览器地址栏 ...
- SSH三大框架的工作原理以及流程
Hibernate工作原理以及为什么要用 原理:1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件2.由hibernate.cfg.x ...