图论技能get!
一个超强大的建图网站

最短路问题

1.dij算法

用于单源最短路
仅适用于没有负边权的情况
初始化dis数组为inf,dis【起点】=0;
tool:priority-queue(按dis升序)
先把起点放进队列
每次取出排头now,枚举它能去的地方v;
如果——

dis[v]>dis[now]+p[i].w

说明目前从now走到v更优,就更新它,并入队
最后now出列,并永远不要回来(用人话说就是判重)

模板

void dij(){for(int i=1;i<=n;i++) dis[i]=INT_MAX;memset(jd,0,sizeof(jd));dis[s] = 0;priority_queue<pr,vector<pr>,greater<pr> >q;q.push(make_pair(0,s));int tot=0;while(!q.empty()){int now=q.top().second;q.pop();if(jd[now]) continue;jd[now]=1;for(int i=fi[now];~i;i=p[i].nxt){int v=p[i].to;//printf("#%d %d %d\n",p[i].nxt,now,v);if(dis[v]>dis[now]+p[i].w){dis[v]=dis[now]+p[i].w;q.push(make_pair(dis[v],v)); }}}
}

(关于链式前向星存图,请移步这里

证明

因为没有负权
所以当前dis最小的值以后不可能从别的地方再更新
所以每次都取最小的,每个就只需取一次(n)

备注

因为优先队列操作复杂度带个log,所以
总复杂度为:O(nlogn)

从证明也可以看出,dij只适用于正权,那么有负权是怎么办?
可以使用——

2.SPFA

“spfa已经死了”
和dij其实很类似,只是他不用优先队列,也不判重,只要枚举出度满足上面那个关系式就可以进队(当然,已经在的不要再进了)
当队列为空结束

代码

void spfa(double x){queue<int>q;mem(jd,1);for(int i=1;i<=n;i++) dis[i]=(double)inf;mem(nm,0);for(int i=0;i<m;i++){p[i].w -= x;}for(int i=1;i<=n;i++){q.push(i);}while(!q.empty()){int now=q.front();q.pop();jd[now]=0;for(int i=fi[now];~i;i=p[i].nxt){int v=p[i].to;if(dis[v]>=dis[now]+p[i].w){dis[v]=dis[now]+p[i].w;if(jd[v]==0) q.push(v);}}}for(int i=0;i<m;i++) p[i].w +=x;return;
}

证明

因为不去重,队列还是空了,说明已经没有任何两对满足更新的关系式~~(暴力有什么好证明的)~~

备注

复杂度十分 玄学 不稳定
在特殊构造和稠密图可能卡成O(mn)
直接裂开(2018NOIP血的教训)
所以尽量还是用dij吧

floyd

多源!!!!
代码《过于冗长》,直接看着代码解释吧。。。

代码

for(int k = 1; k <= n; ++k)for(int i = 1; i <= n; ++i)for(int j = 1; j <= n; ++j)dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);

证明

(想不明白直接背)
dp[i][j][k]是从i到j经过中转编号最大值为k的最短路
那么dp[i][j][k]更新到dp[i][j][k+1]就是看看经过k+1会不会更优呗
所以就是上面那个状态转移方程
最后dp[i][j][n]就是最终的最短路

踩蛋

(这个不是王建国写的)

负环

如果存在一个总权值为负值的环,那么所有能碰到该环的两点的最短路都会是无穷小(大风车吱吖吱悠悠的转 )
此时spfa就会出现死循环
所以需要特殊判断负环
如果一条路径经过的点大于n,显然它是经过了环
而你算着算着最短路它为啥溜号去跑环了呢?一定是出现了负环
从而进行判断
关于代码实现,我们可以在更新时加一行转移:

nm[v]=nm[now]+1

代码

bool spfa(){queue<int>q;mem(jd,0);for(int i=1;i<=n;i++) dis[i]=inf;mem(nm,0);q.push(1);jd[1]=1;dis[1]=0;while(!q.empty()){int now=q.front();q.pop();jd[now]=0;for(int i=fi[now];~i;i=p[i].nxt){int v=p[i].to;if(dis[v]>dis[now]+p[i].w){dis[v]=dis[now]+p[i].w;nm[v]=nm[now]+1;if(jd[v]==0) q.push(v);if(nm[v]>=n){return true;}}}}return false;
}

觉得明白了可以来洛谷水道模板

就酱!拜拜~

最短路模板:dij,spfa与floyd相关推荐

  1. 03 最短路 dijkstra算法spfa算法floyd算法(附带实例代码) 图论-1

    文章目录 最短路 邻接表的图如下 邻接矩阵如下图 链表实现邻接表实现代码 单源最短路径 Dijkstra 算法 朴素版本 Dijkstra 实现代码 堆优化的dijkstra算法代码实现 Bellma ...

  2. 最短路合集(Dijkstra、SPFA、Floyd以及路径还原模板)

    目录 一.Dijkstra算法(不能处理存在负权的清况) 1.堆(优先队列)优化版本:(慢,占用内存还大) 2.普通线段树优化版本(一般块) 2.大佬的特殊线段树优化版本:(超快的) 二.SPFA 算 ...

  3. 【LOJ119】单源最短路 模板

    problem 给你一个n个点m条边的无向图,求 s 到 t 的最短路. solution SPFA模板 codes #include<iostream> #include<queu ...

  4. A*算法+最短路实现K短路+模板题

    <font color=black size=4>K短路问题还是很普遍的,了解一下K短路很有必要,顺便学会A*的简单应用更好. A*算法,是一种启发式搜索算法,我们可以自己设定一个估价函数 ...

  5. luogu P2865 [USACO06NOV]Roadblocks G(次短路模板)

    -题没读清楚,双向边害的我找了半天bug 然后就是一个次短路模板题了. #include<cstdio> #include<cmath> #include<algorit ...

  6. [图论]最短路计数(spfa)

    最短路计数 Description 给出一个NN个顶点MM条边的无向无权图,顶点编号为1-N1−N.问从顶点11开始,到其他每个点的最短路有几条. Input 第一行包含22个正整数N,MN,M,为图 ...

  7. 最短路——最短路计数(spfa)

    题目链接 最短路--最短路计数(spfa) 题目描述 给出一个 N 个顶点 M 条边的无向无权图,顶点编号为 1-N.问从顶点 1 开始,到其他每个点的最短路有几条. 输入格式 第一行包含 2 个正整 ...

  8. E 小木乃伊到我家(最短路模板题)

    链接:https://ac.nowcoder.com/acm/contest/96/E 来源:牛客网 题目描述 AA的欧尼酱qwb是个考古学家,有一天qwb发现了只白白圆圆小小的木乃伊,它是个爱哭鬼却 ...

  9. hdu 1874 畅通工程续(模板题 spfa floyd)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 spfa 模板 1 #include<iostream> 2 #include<s ...

最新文章

  1. leetcode 199. Binary Tree Right Side View | 199. 二叉树的右视图(Java)
  2. 问题: 将N个元素使用push_back插入到vector中, 求push_back操作的复杂度。
  3. LeetCode每日打卡 - 汉明距离总和
  4. python做网络的仿真_用python自动化仿真HFSS,超简易
  5. Java关键字---this的由来和其三大作用
  6. ajax跨域问题解决(spring boot)
  7. python如何使用本地数据库_使用Python在虚拟机上怎么连接本地数据库
  8. 华为数通部门怎么样_华为HCIA考试内容,考试费用及考试编号
  9. RHEL7.X双网卡绑定
  10. 新手指南: 手把手教你安装 Ubuntu 和 Fedora
  11. Code Combat 适合初中生、高中生 学习代码的游戏
  12. 直播技术原理:CDN技术详解
  13. Python实现汉译英
  14. tlwdr5660间歇性掉线_tl-wdr7660无线掉线?tl-wdr7660路由不稳定怎么办?
  15. android动态权限依赖库,动态申请app权限:郭霖大神的PermissionX库带你告别原生
  16. 解决无法解析服务器DNS地址
  17. 《数据分析-SmartChart02》SmartChart低代码平台-可视化开发
  18. 亿道丨三防手机丨手持终端丨PDA丨优势与特点
  19. c# winform 查源码综合工具及方法、快速查c#源码方法,加壳工具
  20. android连iphone热点超时,Android19连接iOS13个人热点失败

热门文章

  1. 字体编辑器_FontLab 7 ——字体编辑器
  2. java typereference_记录一下jackson中TypeReference的使用
  3. 计算机表演赛新疆赛区,【图】第二十六届中国儿童青少年威盛中国芯HTC计算机表演赛“中国电信天翼杯”新疆赛区总决赛圆满结束_乌鲁木齐教育信息网...
  4. java短信接口 调用_带你了解短信接口的调用
  5. disconf mysql_Docker搭建disconf环境,三部曲之三:细说搭建过程
  6. python如何封装成可调用的库_Python实现打包成库供别的模块调用
  7. 7-9 删数问题 (10 分)(思路加详解)
  8. C++中getline()和cin()同时使用时的注意事项
  9. [mybatis]映射文件_select_resultMap_关联查询
  10. [设计模式]简单工厂和工厂方法模式适用场景