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. __x__(6)0905第二天__标签属性=“值”

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

  2. HTML5_canvas_图片加载_双缓冲_跳帧闪烁问题

    canvas 图片加载 pen.drawImage(ele, showX, showY, imgWidth, imgHeight); ele    将 img 元素 加载到画布上 步骤 1. 创建一个 ...

  3. static和extern的用法小结

    以前写程序是,基本不管static和extern,一个工程文件也只有一个c文件.今天尝试用多个文件来写,自然就涉及到这两个关键词的使用,自己查了些资料,并且做了些实验,总结如下. extern的用法 ...

  4. DTcms 模版用vs2015或2017 打开编辑时候 粘贴出问题 代码被调整

    因为模版语言不是标准的HTML格式 ,所以HTML粘帖的时候会格式化 导致原标签出问题,这里修改下就可以了

  5. if-else案例–开关灯

    首先,创建一个html页面,添加一个div盒子,用css设置相应的样式,用js获取盒子的元素,通过点击事件,设置body的背景颜色,用if..else来判断当什么状态设置相应的颜色,(swith... ...

  6. Selenium 3----获取断言信息

    断言:把实际结果与预期进行比较. 一般可以通过获取title .URL和text等信息进行断言. title:用于获得当前页面的标题. current_url:用户获得当前页面的URL. text:获 ...

  7. WordCount测试项目小结

    一.本文对应项目GitHub地址 https://github.com/ReWr1te/WCProject 请参照最新版本(WCProject4.0) 二.项目PSP表格 PSP2.1 PSP阶段 预 ...

  8. 由PHP实现单向链表引发的对象赋值,对象传参,链表操作引发的一系列问题

    2019年2月25日14:21:13 测试版本php 5.4 ,5.6,7.0,7.2 代码请看: https://www.cnblogs.com/zx-admin/p/10373866.html 1 ...

  9. TCP三次握手那些事

    临近5月,春招和实习招聘逐渐进入尾声.本文主要讨论面试中经常提问的TCP连接的机制,附带一些扩展知识. 参加面试的时候,过半的面试官都会问TCP相关问题,而最常见的问题就是:讲一下TCP三次握手(四次 ...

  10. 【Python全栈-JavaScript】jQuery效果

    jQuery效果 jQuery 效果函数: 方法 描述 animate() 对被选元素应用“自定义”的动画 clearQueue() 对被选元素移除所有排队的函数(仍未运行的) delay() 对被选 ...