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 【模板】单源最短路径(弱化版)的更多相关文章

  1. luogu P3371 & P4779 单源最短路径spfa & 最大堆优化Dijkstra算法

    P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出 ...

  2. 【洛谷 p3371】模板-单源最短路径(图论)

    题目:给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 解法:spfa算法. 1 #include<cstdio> 2 #include<cstdlib> 3 #in ...

  3. [模板]单源最短路径(Dijkstra)

    如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 主要还是再打一遍最短路,这种算法我用的不多... #include<bits/stdc++.h> using namesp ...

  4. 单源最短路径(dijkstra算法)php实现

    做一个医学项目,当中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路例如以下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么( ...

  5. 图->最短路径->单源最短路径(迪杰斯特拉算法Dijkstra)

    文字描述 引言:如下图一个交通系统,从A城到B城,有些旅客可能关心途中中转次数最少的路线,有些旅客更关心的是节省交通费用,而对于司机,里程和速度则是更感兴趣的信息.上面这些问题,都可以转化为求图中,两 ...

  6. 洛谷 P3371 【模板】单源最短路径(弱化版) 题解

    P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出 ...

  7. P3371 【模板】单源最短路径(弱化版)(Dijkstra算法)

    题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三 ...

  8. 洛谷P3371 【模板】单源最短路径

    P3371 [模板]单源最短路径 282通过 1.1K提交 题目提供者HansBug 标签 难度普及/提高- 提交  讨论  题解 最新讨论 不萌也是新,老司机求带 求看,spfa跑模板40分 为什么 ...

  9. 洛谷 P3371 【模板】单源最短路径

    P3371 [模板]单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出 ...

随机推荐

  1. 03_ if 练习 _ little2big

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. Android常用的工具类SharedPreferences封装类SPUtils

    package com.zhy.utils; import java.lang.reflect.InvocationTargetException; import java.lang.reflect. ...

  3. IP协议号 IP首部中有8位协议号,用于指明IP的上层协议.

    IP协议号   IP首部中有8位协议号,用于指明IP的上层协议. 0 HOPOPT IPv6 逐跳选项 1 ICMP Internet 控制消息 2 IGMP Internet 组管理 3 GGP 网 ...

  4. 复制pdf文字出来是乱码

    PDF文件复制文本为乱码 - longzhinuhou的博客 - CSDN博客 https://blog.csdn.net/longzhinuhou/article/details/83758966 ...

  5. CITS1401 Computational Thinking with Python

    Department of Computer Science and Software EngineeringCITS1401 ComputationalThinking with PythonPro ...

  6. MFC 修改标题

    1. Overwrite CMainFrame::PreCreateWindow. Clear the style FWS_ADDTOTITLE cs.style &= ~(LONG)FWS_ ...

  7. mysql 字符集

    mysql -u root -p 输入密码进入mysql show variables like 'character%'; --显示字符集,像这样 \q退出mysql, 更改mysql配置文件 vi ...

  8. ADB——keyevent命令

    基本格式 adb shell input keyevent xxx # xxx为具体操作对应的数字 keycode 官方 KEYCODE 链接:戳这里 0 KEYCODE_UNKNOWN 未知按键 1 ...

  9. Chrome浏览器添加控件

    1. 添加user agent swithcher模拟浏览器内核 方法: 下载user agent switcher后,打开谷歌浏览器,先复制chrome://extensions/  到浏览器地址栏 ...

  10. SSH三大框架的工作原理以及流程

    Hibernate工作原理以及为什么要用 原理:1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件2.由hibernate.cfg.x ...