Floyd算法:用来找出每对点之间的最短距离。图可以是无向图,也可以是有向图,边权可为正,也可以为负,唯一要求是不能有负环。 
1.初始化:将Map[][]中的数据复制到Dist[][]中作为每对顶点之间的最短路径的初值,Pre[i][j] = i 表示 i 到 j 路径中 j 的前一节点。 
2. k 从 1 到 N 循环 N 次,每次循环中,枚举图中不同的两点 i,j,如果Dist[i][j] > Dist[i][k] + Dist[k][j],则更新Dist[i][j] = Dist[i][k] + Dist[k][j],更新Pre[i][j] = Pre[k][j]。 
只要图中不存在负环就可以得出正确的答案,关于Floyd算法对负环的判定,参考下边Floyd求最小环。

<code class="hljs markdown has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">const int MAXN = 110;
const int INF = 0xffffff0;int Map[<span class="hljs-link_label" style="box-sizing: border-box;">MAXN</span>][<span class="hljs-link_reference" style="box-sizing: border-box;">MAXN</span>], Dist[<span class="hljs-link_label" style="box-sizing: border-box;">MAXN</span>][<span class="hljs-link_reference" style="box-sizing: border-box;">MAXN</span>],Pre[<span class="hljs-link_label" style="box-sizing: border-box;">MAXN</span>][<span class="hljs-link_reference" style="box-sizing: border-box;">MAXN</span>];
//Pre[<span class="hljs-link_label" style="box-sizing: border-box;">i</span>][<span class="hljs-link_reference" style="box-sizing: border-box;">j</span>] = i表示i到j路径中j的前一节点
void Floyd(int N)
{   //初始化
<span class="hljs-code" style="box-sizing: border-box;">    for(int i = 1; i <= N; ++i)</span>
<span class="hljs-code" style="box-sizing: border-box;">    {</span>
<span class="hljs-code" style="box-sizing: border-box;">        for(int j = 1; j <= N; ++j)</span>
<span class="hljs-code" style="box-sizing: border-box;">        {</span>
<span class="hljs-code" style="box-sizing: border-box;">            Dist[i][j] = Map[i][j];</span>
<span class="hljs-code" style="box-sizing: border-box;">            Pre[i][j] = i;</span>
<span class="hljs-code" style="box-sizing: border-box;">        }</span><span class="hljs-code" style="box-sizing: border-box;">    }</span>
<span class="hljs-code" style="box-sizing: border-box;">    for(int k = 1; k <= N; ++k)</span>
<span class="hljs-code" style="box-sizing: border-box;">    {</span>
<span class="hljs-code" style="box-sizing: border-box;">        for(int i = 1; i <= N; ++i)</span>
<span class="hljs-code" style="box-sizing: border-box;">        {</span>
<span class="hljs-code" style="box-sizing: border-box;">            for(int j = 1; j <= N; ++j)</span>
<span class="hljs-code" style="box-sizing: border-box;">            {   //如果Dist[i][j] > Dist[i][k] + Dist[k][j],则更新</span>
<span class="hljs-code" style="box-sizing: border-box;">                if(Dist[i][k] != INF && Dist[k][j] != INF && Dist[i][k] + Dist[k][j] < Dist[i][j])</span>
<span class="hljs-code" style="box-sizing: border-box;">                {</span>
<span class="hljs-code" style="box-sizing: border-box;">                    Dist[i][j] = Dist[i][k] + Dist[k][j];</span>
<span class="hljs-code" style="box-sizing: border-box;">                    Pre[i][j] = Pre[k][j];  //更新Pre[i][j]</span>
<span class="hljs-code" style="box-sizing: border-box;">                }    </span>
<span class="hljs-code" style="box-sizing: border-box;">            }</span>
<span class="hljs-code" style="box-sizing: border-box;">        }</span>
<span class="hljs-code" style="box-sizing: border-box;">    }</span>
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li></ul>

如果求点u到点v能达到的最长边尽可能短的路径上最长边为多少,将循环内部改为如下代码:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> tMax;   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//这里边求的是能达到的路径上最长边最小为多少  </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(Dist[i][k] > Dist[k][j])  tMax = Dist[i][k];  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>  tMax = Dist[k][j];  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(Dist[i][j] > tMax)  Dist[i][j] = tMax;  </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>

Floyd求最小环 
不能在Map[][]数组上直接计算,因为判断过程中用到了Map[][]原始值。

<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> MAXN = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">110</span>;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> INF = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0xffffff0</span>;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> temp,Map[MAXN][MAXN],Dist[MAXN][MAXN],pre[MAXN][MAXN],ans[MAXN*<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>];<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> Solve(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> j,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> k)
{temp = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//回溯,存储最小环</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span>(i != j){ans[temp++] = j;j = pre[i][j];}ans[temp++] = i;ans[temp++] = k;
}
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> Floyd(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> N)
{<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; i <= N; ++i)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> j = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; j <= N; ++j){Dist[i][j] = Map[i][j];pre[i][j] = i;}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> MinCircle = INF;    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//最小环</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> k = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; k <= N; ++k){<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; i <= N; ++i){<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> j = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; j <= N; ++j){<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(i != j && Dist[i][j] != INF && Map[i][k] != INF && Map[k][j] != INF&& Dist[i][j] + Map[i][k] + Map[k][j] < MinCircle){MinCircle = min(MinCircle, Dist[i][j] + Map[i][k] + Map[k][j]);Solve(i,j,k);   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//回溯存储最小环</span>}}}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; i <= N; ++i){<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> j = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; j <= N; ++j){<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(Dist[i][k] != INF && Dist[k][j] != INF &&Dist[i][k] + Dist[k][j] < Dist[i][j]){Dist[i][j] = Dist[i][k] + Dist[k][j];pre[i][j] = pre[k][j];  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//记录点i到点j的路径上,j前边的点</span>}}}}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(MinCircle == INF)    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//不存在环</span>{<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"No solution.\n"</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>;}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//如果求出最小环为负的,原图必定存在负环</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;i < temp; ++i)    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//输出最小环</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(i != temp-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%d "</span>,ans[i]);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%d\n"</span>,ans[i]);
}</code>

多源最短路径Floyd、Floyd求最小环【模板】相关推荐

  1. 最短路径:Dijkstra算法(求单源最短路径)Floyd算法(求各顶点之间最短路径)

    最短路径: 在一个带权图中,顶点V0到图中任意一个顶点Vi的一条路径所经过边上的权值之和,定义为该路径的带权路径长度,把带权路径最短的那条路径称为最短路径. DiskStra算法: 求单源最短路径,即 ...

  2. 短小精悍的多源最短路径算法—Floyd算法

    前言 在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径. 在单源正权值最短路径,我们会用Dijkstra ...

  3. floyd求最小环 模板

    http://www.cnblogs.com/Yz81128/archive/2012/08/15/2640940.html 求最小环 floyd求最小环 2011-08-14 9:42 1 定义: ...

  4. Floyd算法求最小环

    /**算法引入:*求一个图G中的最小环路的朴素算法为:每次找到一条边,删除了求这两点之间的最短路径;*若能求出,则这条最短路径与原来的边构成一个环,不过时间复杂度略高;**算法思想;*Floyd算法是 ...

  5. 图论-全源最短路径-对比Floyd算法与暴力Dijkstra算法

    题目 输入顶点数N,有向边数M,接下来M行输入格式为u,v,w分别代表两个顶点u,v和两点之间边的权值w.输出全源最短路径 输入样例: 6 8 0 1 1 0 3 4 0 4 4 1 3 2 2 5 ...

  6. HDU1599 find the mincost route Floyd算法求最小环

    find the mincost route 杭州有N个景区,景区之间有一些双向的路来连接,现在8600想找一条旅游路线,这个路线从A点出发并且最后回到A点,假设经过的路线为V1,V2,....VK, ...

  7. 图的单源最短路径,Floyd算法(数据结构c++)

    这个算法结构很是简单,但是理解还是有一定的困难,一开始做的时候想不明白,跟着算法自己动手画画就知道这个算法具体是怎么回事了. 时间复杂度是O(N*3) 算法有点动态规划的意思,有两个数组,一个(dis ...

  8. poj 1734 Sightseeing trip(floyd 拓展 求最小环)

    对于floyd 拓展为什么可以判断 出最小环还是不是太理解 苟且 先贴下模版吧 感谢:心_随_梦_翔 的分析 http://hi.baidu.com/%D0%C4_%CB%E6_%C3%CE_%CF% ...

  9. 图论-单源最短路径算法(拓扑,Dijkstra,Floyd,SPFA)

    前言 单源最短路径是学习图论算法的入门级台阶,但刚开始看的时候就蒙了,什么有环没环,有负权没负权,下面就来总结一下求单源最短路径的所有算法以及其适用的情况. 单源最短路径 设定图中一个点为源点,求其他 ...

  10. hdu 1599(Floyd求最小环)

    find the mincost route Time Limit: 1000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

最新文章

  1. 开源wkhtmltopdf使用心得 (二)
  2. 亚马逊Rekognition发布针对人脸检测、分析和识别功能的多项更新
  3. 全国计算机等级考试题库二级C操作题100套(第33套)
  4. KUDU数据导入尝试一:TextFile数据导入Hive,Hive数据导入KUDU
  5. linux查看服务器温度指令,linux查看服务器温度
  6. Basic Edit in vim
  7. 2018年千锋Java微服务架构视频教程
  8. 一个最基本最简单的爬虫代码【精简】
  9. web前端网页设计期末课程大作业:旅游网页主题网站设计——紫色的旅游开发景点网站静态模板(4页)HTML+CSS+JavaScript
  10. 堪萨斯州立大学计算机科学,2020年堪萨斯州立大学排名TFE Times美国最佳计算机科学硕士专业排名第99...
  11. JS脚本defer的作用 (转自一路前行)
  12. 玩家交互体验—剑网3聊天系统
  13. 有个程序猿很忧桑:一个命令rm -rf/ ,他把整个公司删没了...
  14. [ Java面试题 ]Java 开发岗面试知识点解析
  15. android studio视频路径,Android studio相关设置及实现存在于工程目录中的视频播放...
  16. 在线听著名英文原版小说(朗读版超赞)
  17. Concepts:Overview
  18. 驯龙高手java版_石器时代2驯龙高手
  19. 2022年深圳技能大赛-大数据技术应用职业技能竞赛介绍
  20. 基于虚拟筛选,从头设计的方法对蛋白酪氨酸酶1B,4-噻唑啉酮类抑制剂的研究

热门文章

  1. 【错误记录】Visual Studio 中配置 NDK 头文件路径 ( NDK 的三个头文件路径 | 与 CPU 架构相关 asm 头文件路径选择 )
  2. 【错误记录】无法打开 “xxx“ , 因为 Apple 无法检查其是否包含恶意软件
  3. 【Java 虚拟机原理】Class 字节码二进制文件分析 五 ( 方法计数器 | 方法表 | 访问标志 | 方法名称索引 | 方法返回值类型 | 方法属性数量 | 方法属性表 )
  4. 【错误记录】jar 执行错误 ( java.lang.UnsupportedClassVersionError: Unsupported major.minor version 52.0 )
  5. 阿里开源项目汇总(二十)
  6. 【2017-05-30】WebForm文件上传。从服务端删除文件
  7. PHP array_intersect_uassoc
  8. linux基础学习7
  9. 区域经济、地理信息、互联网三者交叉之行业背景分析
  10. SS, SP, BP 三个寄存器的不同和应用