最短路径 SPFA P3371 【模板】单源最短路径(弱化版)

时间:2021-03-13 04:00:14

P3371 【模板】单源最短路径(弱化版)

SPFA算法:

SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环。SPFA 最坏情况下复杂度和朴素 Bellman-Ford 相同,为 O(VE)。

最短路径   SPFA    P3371 【模板】单源最短路径(弱化版)

SPFA和Dijkstra不同的是:

Dijkstra  是从一个点的所有出边中找到一个最短出边,用它来继续更新下边的点

   SPFA     是用一个点的所有出边都更新它下面的点

更新之前把这个点存进队列

更新时把他拿出来,再把更新的出边终点(未入队的)入队

一直不断更新,直到队列为空

队列里存的是点

(下面有详细解释,在链式前向星以后)

head[---]     这里大小根据点数决定
                    记录存边的历史,存的是i点的最后一条出边(它经历了不断更新)

vis[---]         判断是否已存入队列

 dis[---]         从起点开始到当前点的最短路径

num_edge  表示边的编号

这里要用链式前向星存图:

最短路径   SPFA    P3371 【模板】单源最短路径(弱化版)

最短路径   SPFA    P3371 【模板】单源最短路径(弱化版)

//以下为链式前向星存图
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

最短路径   SPFA    P3371 【模板】单源最短路径(弱化版)用到1就把它弹出最短路径   SPFA    P3371 【模板】单源最短路径(弱化版)再用6更新5入队最短路径   SPFA    P3371 【模板】单源最短路径(弱化版)再用3更新最短路径   SPFA    P3371 【模板】单源最短路径(弱化版)

直到队列为空

【代码】:

#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 &amp&semi; P4779 单源最短路径spfa &amp&semi; 最大堆优化Dijkstra算法

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

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

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

  3. &lbrack;模板&rsqb;单源最短路径(Dijkstra)

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

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

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

  5. 图-&gt&semi;最短路径-&gt&semi;单源最短路径&lpar;迪杰斯特拉算法Dijkstra&rpar;

    文字描述 引言:如下图一个交通系统,从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. Linux 字符设备控制技术

    字符设备控制技术 一.字符设备控制理论 1.作用 大部分设备除了具有<读写设备>的能力,还应该有<控制设备>的能力.比如改变 波特率 2. 应用程序接口 在用户空间中使用 Io ...

  2. 3&period;1决策树理论--python深度机器学习

    参考彭亮老师的视频教程:转载请注明出处及彭亮老师原创 视频教程: http://pan.baidu.com/s/1kVNe5EJ   0. 机器学习中分类和预测算法的评估:   准确率 速度 强壮行 ...

  3. JavaScript实现鼠标拖拽围绕圆心转动

    鼠标拖动时旋转(多个节点以同一点旋转) 鼠标拖动时旋转 音量旋钮 圆盘菜单

  4. Android破解学习之路(十五)—— 【Unity3D】洛菲斯的呼唤(Lophis roguelike)无限金币(道具)的实现 破解

    前言 之前玩月圆之夜玩的挺high的,最近又找到了个与月圆之夜类似的卡牌游戏,游戏名为Lophis roguelike,中文翻译名洛菲斯的呼唤. 但是这个与月圆之夜有所不同,如果失败了,只能从开头重新 ...

  5. linux内核剖析(七)Linux进程间通信的几种方式总结

    进程间通信概述 进程通信的目的 数据传输 一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数据 多个进程想要操作共享数据,一个进程对共享数据 通知事 一个进程需要向另 ...

  6. 8&period;1Python面向对象编程(一)

    目录 目录 前言 (一)基本概念 ==1.面向过程与面向对象== ==2.类与对象== (二)类属性的相关操作 ==1.定义一个经典类== ==2.对象属性的操作== ==3.类属性的操作== ==4 ...

  7. zookeeper logs and snapshot

    来自:http://xstarcd.github.io/wiki/Cloud/zookeeper_log_snapshot.html 事务日志可视化转换 1 2 3 4 5 6 7 8 9 10 11 ...

  8. Django使用静态文件

    除了由服务器生成的HTML文件外,网页应用一般需要提供其它必要的文件 —— 比如图片文件.JavaScript脚本和CSS样式表 —— 来为用户呈现出一个完整的网站. 在Django中,我们将这些文件 ...

  9. 单例模式简介以及C&plus;&plus;版本的实现

        本篇博文主要内容参考 C++的单例模式一文,在此,为原作者耐心细致的分析讲解,表示感谢.本文将结合此篇文章,给出自己做实验后的理解以及代码,作为今天学习的小结.     单例模式,它的意图是保 ...

  10. XML&lowbar;CPP&lowbar;ZC&lowbar;libXml2

    1.错误信息: /* * Use the following function to reset the two global variables * xmlGenericError and xmlG ...