##算法功能

  找最短路(最长路?)

##算法思想

  用一个节点k更新节点i到节点j的最短路

##邻接链表存储

  基础而高效的图的存储方式

  存的是单向边(无向边可以看成两条有向边)

##实现

  维护节点i到源点s的最小值d[i]

  用队列实现

    维护队列z,

      用visit[]记录一个点是否在队列

    从源点开始进队列,每次弹出队头元素x,(标记visit[x]=0)

    用它的最短路d[x]将与它相连的节点y的最短路d[y]更新

    如果y不在队列(visit[y]==0),让y入队,记录(visit[y]=1)

    直到队列为空,所有节点的d[]都已维护好

##判断负环

  若图中存在负环,则更新时一定不断地让负环上的节点入队,负环上的点一定会无数次入队,最终死循环

  所以我们记录一个点入队的次数sum[],sum[i]在每次i入队时++,如果sum[i]贼大,贼大,证明有负环

    贼大到多大呢?贼大到2*m(m是边数)就肯定死循环了

    反正就是不能比2*m大(一共m条边,假设都与节点i相连,则i最多入队m次(当然不可能所有边都让i走一遍)(老师让sum[i]和m*2比较,不知道为啥那么大

 #include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <queue>
#define N 100010
#define M 100010
//复杂度上限m*n
//n个点,每个如m次 //正常nlogn //网格图贼慢
using namespace std; queue <int> z;
int d[N],len,visit[N],n,m; //采用结构体存图
struct edge
{
int x,y,k,next;
}a[M];
// 邻接链表存储
int first[M];
void ins(int x,int y,int k)
{
len++;
a[len].x=x;
a[len].y=y;
a[len].k=k;
a[len].next=first[x];
first[x]=len;
}
int sum[N]; int main()
{
cin>>n>>m;
memset(d,,sizeof(d));//63是billion(十亿)级别的10 6110 9567
int x,y,k;
for(int i=;i<=m;i++)
{
cin>>x>>y>>k;
ins(x,y,k);
ins(y,x,k);
}
int s;
cin>>s;//源点
z.push(s);
visit[s]=;
d[s]=; //******主体代码
while(!z.empty())
{
x=z.front();
for(int k=first[x];k;k=a[k].next)
{
y=a[k].y;
if(d[x]+a[k].k < d[y])
{
d[y]=d[x]+a[k].k;
if(!visit[y])
{
// sum[y]++;
z.push(y);//这是一个迭代的过程(老师说的,其实我不知道啥是迭代)
visit[y]=;
}
}
}
z.pop();
sum[x]++;
/*if(sum[x] > 2*m)//判断负环 有时会用到
{
printf("NO");
break;
}*/
visit[x]=;
}
//**********
for(int i=;i<=n;i++) cout<<d[i]<<" ";//得到所有节点到源点的最短路
return ;
}

【笔记】最短路——SPFA算法的更多相关文章

  1. 图论-单源最短路-SPFA算法

    有关概念: 最短路问题:若在图中的每一条边都有对应的权值,求从一点到另一点之间权值和最小的路径 SPFA算法的功能是求固定起点到图中其余各点的的最短路(单源最短路径) 约定:图中不存在负权环,用邻接表 ...

  2. 图论算法(三) 最短路SPFA算法

    我可能要退役了…… 退役之前,写一篇和我一样悲惨的算法:SPFA 最短路算法(二)SPFA算法 Part 1:SPFA算法是什么 其实呢,SPFA算法只是在天朝大陆OIers的称呼,它的正统名字叫做: ...

  3. 最短路-SPFA算法&Floyd算法

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

  4. poj 3013 最短路SPFA算法

    POJ_3013_最短路 Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 23630 ...

  5. 最短路 spfa 算法 && 链式前向星存图

    推荐博客  https://i.cnblogs.com/EditPosts.aspx?opt=1 http://blog.csdn.net/mcdonnell_douglas/article/deta ...

  6. 单源最短路——SPFA算法(Bellman-Ford算法队列优化)

    spfa的算法思想(动态逼近法):     设立一个先进先出的队列q用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路 ...

  7. 单源最短路SPFA算法

    $huaji^{233……}$模板:洛谷 P3371 #include<iostream> #include<algorithm> #include<cstdio> ...

  8. 洛谷 P1266 速度限制 最短路+SPFA算法

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 P1266 速度限制 题目描述 在这个繁忙的社会中,我们往往不 ...

  9. 洛谷 P1073 最优贸易 最短路+SPFA算法

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 P1073 最优贸易 题目描述 C国有 $ n $ 个大城市和 ...

随机推荐

  1. 变量键盘读取、数组与宣告:read,array,declare

    1.read 2.declare/typeset 宣告变量的类型 3.数组(array)变量类型 4.与文件系统及程序的限制关系:ulimit 限制用户的某些系统资源,包括,可以开启的文件的数量,可以 ...

  2. 使用redis的zset实现高效分页查询(附完整代码)

    一.需求 移动端系统里有用户和文章,文章可设置权限对部分用户开放.现要实现的功能是,用户浏览自己能看的最新文章,并可以上滑分页查看. 二.数据库表设计 涉及到的数据库表有:用户表TbUser.文章表T ...

  3. KindEditor.ready 不执行的解决方法

    问题描述 按照官网的要求,一一都设置好了,但就是没法显示富文本编辑器. 1.设置好textarea输入框 <textarea id="myEditor" name=" ...

  4. AESEncryption Aes 加密

    /******************************************************* * * 作者:朱皖苏 * 创建日期:20180521 * 说明:此文件只包含一个类,具 ...

  5. Beetlex实现完整的HTTP协议

    在传统网络服务中扩展中需要处理Bytes来进行协议的读写,这种原始的处理方式让工作变得相当繁琐复杂,出错和调试的工作量都非常大:组件为了解决这一问题引用Stream读写方式,这种方式可以极大的简化网络 ...

  6. Spirng Boot2 系列教程(二十二)| 启动原理

    一个读者,也是我的好朋友投稿的一篇关于 SpringBoot 启动原理的文章,才大二就如此优秀,未来可期. 我一直想了解一下 SpirngBoot 的是如何启动的,我想就来写一篇关于 SpirngBo ...

  7. [洛谷P4617] [COCI2017-2018#5] Planinarenje

    Description \(Mirko\) 和 \(Slavko\) 喜欢一起去远足. \(Mirko\) 偏好攀登山峰,而 \(Slavko\) 偏爱山谷.因此每次他们登上一座山峰后,\(Slavk ...

  8. 编写python程序读入1到100之间的整数,然后计算每个数出现的次数,输入0表示结束输人,输入数据不包括0。如果数出现的大现如果大于1,输出时使用复数times

    #-*- coding:UTF-8 -*- #环境:python3 print("Enter the numbers between 1 and 100:") enterList= ...

  9. oracle 11g数据库服务器安装

    系统:windows7旗舰版 64位.oracle数据库服务器版本:oracle11g. 一.下载   1.登录oracle账户: 首先打开谷歌浏览器,输入网址[英文版网址:https://www.o ...

  10. python HelloWorld 的 4 种姿势,你知道几种

    安装完 Python 之后该干啥,当然是要 say HelloWorld 了. python.exe 就是个普通程序 和其它所有命令一样,在命令行中敲下 python 并回车的时候,操作系统去 PAT ...