写在算法前面:

前向星存图(一个神奇的超越邻接矩阵的存在)

首先讲一下需要定义的一些东西??

1.head数组:head[点数]:head[i]表示以当前点i为起点的最后一条边(这里的最后指的是编号【我们按输入顺序给边编一个号】)。

这个图即为head[1]=4,表示以1为起点的边的最后一条是点1—>点5编号为4的边;

2.num_edge,表示边的总个数;

3.结构体:

struct Edge{
int next,to,dis;
}edge[边数];

这里,edge[i].next表示上一条以i为起点的边:

还是上面那个图,这里edge[4].next=3;

edge[i].to表示这条边i的终点;

edge[i].dis表示这条边的权值;

存图
void addedge(int from,int to,int dis){
num_edge++;//因为存入一条边,总边数+1;
edge[num_edge].next=head[from];//新存入一条以from为起点的边,之前的以from为起点的最后一条边变成了新边的上一条边
edge[num_edge].to=to;//存终点
edge[num_edge].dis=dis;//存权值
head[from]=num_edge;//存入一条以from为起点的边,那么现在以from为起点的最后一条边就是新存入的边
}

提醒:如果要存的是无向图,进行程序时应该:addedge(from,to,dis),addedge(to,from,dis)各跑一遍,所开空间也要*2;

大概是讲完了链式前向星存图;

spfa

算法思想:

1.运用队列的思想,先把起点入队,更新起点能够到达的点,更新这些点到起点的伪最短路(因为可能还有更短情况)然后把得到更新的点中不在队列里的加入队列,以便更新其他点。

2.当前更新的是伪最短路即可能会有更优情况

eg:起点是1,1到6距离为7,加入队列dis[6]=7,而1到7距离为2,7到6距离为3,会将dis[6]更新为2+3=5。所以一遍一遍查,最后将会是最短路。

时间复杂度大约是O(ke),稀疏图中k约等于2,但是毒瘤数据会把复杂度卡成O(nm);

spfa在存图基础上再开vis[点数]查询某个点是否已经在队列里,避免重复入队(请注意,是是否在队列里 队列里 队列里)

dis[点数]用来存某个点到起点的最短路;

以洛谷p3371【模板】单源最短路径(弱化版) 为例纸(标准的过不去qwq)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue> using namespace std; const int inf=;//题目要求的初始值 queue <int> q;//定义一个队列q
int n,m,s;
int head[],num;
int vis[],dis[]; struct Edge{
int next,to,dis;
}edge[]; void addedge(int from,int to,int dis){//加边
num++;
edge[num].next=head[from];
edge[num].to=to;
edge[num].dis=dis;
head[from]=num;
} void spfa(){
for(int i=;i<=n;i++){//首先初始化,将所有点的dis赋值为2147483647,所有点都不在队列里,vis为0
dis[i]=inf;
vis[i]=;
}
q.push(s);//把起点入队
dis[s]=;//起点到起点,最短路为0
vis[s]=;//入队了,vis变为1
while(!q.empty()){//开始循环
int u=q.front();
q.pop();//把队首元素出队
vis[u]=;//出队了,vis重置为0(因为可能还有更近的下次还能循环到)
for(int i=head[u];i;i=edge[i].next){//遍历以u为起点的所有遍
int v=edge[i].to;//v为终点
if(dis[v]>dis[u]+edge[i].dis){//如果之前的最短路比由u点出发再”拐弯“的点的要大,显然他不是最短,更新他
dis[v]=dis[u]+edge[i].dis;
if(!vis[v]){//如果终点不在队列里,入队
q.push(v);
vis[v]=;
}
}
}
}
} int main(){
scanf("%d%d%d",&n,&m,&s);
int u,v,w;
for(int i=;i<=m;i++){
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 ;
}

end-

【图论】最短路问题之spfa的更多相关文章

  1. 图论最短路——spfa

    今天开始图论的最短路的最后复习,今天自己手打spfa虽然看了一眼书,但是也算是自己打出来的,毕竟很久没打了,而且还是一遍a代码下来15min左右就搞完了,成就感++.所以呢来篇博客记录一下. 香甜的黄 ...

  2. 【bzoj2330】: [SCOI2011]糖果 图论-差分约束-SPFA

    [bzoj2330]: [SCOI2011]糖果 恩..就是裸的差分约束.. x=1 -> (A,B,0) (B,A,0) x=2 -> (A,B,1)  [这个情况加个A==B无解的要特 ...

  3. Matlab 图论最短路问题模型代码

    最短路问题的基本内容 最短路问题研究的是,在一个点与点之间连接形成的网络图中,对应路径赋予一定的权重(可以理解为两点之间的距离),计算任意两点之间如何和走,路径最短的问题.在这里的距离可以理解成各种两 ...

  4. 图论最短路径算法——SPFA

    为了不要让太多人被害,我还是说一下这种算法,它实际上很简单,但被人讲着讲着绕晕了. 主要思想 有人说,SPFA是Bellman-Ford的队列优化.这个算法我也懂了,但是还没试过.我不管是什么算法的优 ...

  5. 图论--最短路--SPFA

    SPFA算法(shortest path faster algorithm)算法是西南交通大学段凡丁于1994年发表的,它在Bellman-ford算法的基础上进行了改进,使其在能够处理待负权图的单元 ...

  6. 图论--最短路--SPFA模板(能过题,真没错的模板)

    [ACM常用模板合集] #include<iostream> #include<queue> #include<algorithm> #include<set ...

  7. 【uva 658】It's not a Bug, it's a Feature!(图论--Dijkstra或spfa算法+二进制表示+类“隐式图搜索”)

    题意:有N个潜在的bug和m个补丁,每个补丁用长为N的字符串表示.首先输入bug数目以及补丁数目.然后就是对M个补丁的描述,共有M行.每行首先是一个整数,表明打该补丁所需要的时间.然后是两个字符串,第 ...

  8. 【五一qbxt】day5 图论

    图论 学好图论的基础: 必须意识到图论hendanteng xuehuifangqi(雾 图 G = (V,E) 一般来说,图的存储难度主要在记录边的信息 无向图的存储中,只需要将一条无向边拆成两条即 ...

  9. Codevs 1183 泥泞的道路

    1183 泥泞的道路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路 ...

随机推荐

  1. IP地址数据库 | 手机号段归属地数据库 | 行政区划省市区数据库

    2019年4月最新版 IP地址数据库 (全球版·国内版·国外版·掩码版·英文版) 全球旗舰版 454267行   国内精华版 244379行 演示  https://www.qqzeng.com/ip ...

  2. WPF中查找指定类型的父控件

    /// <summary> /// 查找父控件 /// </summary> /// <typeparam name="T"></type ...

  3. Javascript基础语法(三)

    数组 1.什么是数组 有许多变量,它们的名称和数据类型都是一致的. 2. 数组声明 var arr = [元素,元素,元素...]; var arr = new Array(元素,元素,元素...); ...

  4. 多个for循环嵌套会影响速度

    在复现Meta-SR的过程中,发现如果嵌套多个for 循环会使速度过慢.这是下面实验得出的结论: import time t1 = time.time() a = range(3000) b = ra ...

  5. Linux高效数据统计命令wc

    wc(world count)是一个统计文件字词,字节,行数的命令,它可以帮我们非常方便的统计以上信息. 主要参数 常见参数如下: -c 统计字节数. -l 统计行数. -m 统计字符数.这个标志不能 ...

  6. jmeter接口/性能压测入门

    1.相关知识 https://www.cnblogs.com/star91/p/5059222.html http://www.51testing.com/zhuanti/jmeter.html 测试 ...

  7. 富文本编辑,xss攻击

    富文本编辑 KindEditor 在线HTML编辑器 http://kindeditor.net/doc.php 下载成功,解压放到项目中去 查看官方文档进行操作 xss攻击 XSS攻击全称跨站脚本攻 ...

  8. JS(JavaScript)的进一步了解4(更新中···)

    基类Object的子类有 Function  Array  Number  Boolean  String  Date  Math  RegExp 函数 数组 数字 布尔 字符串 日期 算数 正则 都 ...

  9. Java中静态变量与实例变量

    知识回顾 上一篇总结了java中成员变量和局部变量的区别,这一篇将总结静态变量和实例变量的一些特性和区别. 示例代码 package Variable; public class VariableDe ...

  10. windows中的软链接硬链接等

    学校嘛,有些时候还是得逆逆上网客户端啥的,并且学校的不少工作,这Windows的需求还是挺强的,之前Win10的体验并不是太好,不过时隔这么久,打算从7升级到10了,恰好系统也该换了. 首先是命令行的 ...