floyd三重循环最外层为什么一定是K

Floyd算法为什么把k放在最外层? - 知乎 https://www.zhihu.com/question/30955032
高票答案:

简单地总结一下:K没放在最外面一定是错的,但是在某些数据比较水的情况下可能会AC
floyd的本质是DP,K表示的是的DP的阶段,经过这个点松弛或者不经过这个点,如果你把K放在最里面,有可能某些点没有松弛到,所求的边就不会是最优解

如下例子说明:

from to cost

1   2    4
   2   3    5
   3   4    3
   4   5    2
   1   5    1

如果以i,j,k的顺序去遍历,那么就会出现如下情况:
假设运行到i=1 j=3
k=1,1->3=inf
k=2,1->3=9
k=3, 1->3:9
k=4,还是不变 ,本来正常情况下不是可以通过4去松弛1->3的距离吗
但最优解是1->5->4->3=6
为什么会这样呢,因为在计算1->3的距离时,我们并没有去松弛 1->4的距离,造成无法通过4去松弛1->3

原文地址:https://www.cnblogs.com/simaomao/p/12292903.html

时间: 2024-11-02 07:25:26

floyd三重循环最外层为什么一定是K的相关文章

三重循环实现四位的吸血鬼数

题目:吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中抽取的数字可以任意排序.以两个0结尾的数字是不允许的.例如下列的数字都是"吸血鬼"数字: 1260=21*60 1827=21*87 2187=27*81 写一个程序,找出四位数的所有吸血鬼数. 思路:将四位数按位拆分为四个数字,由这四个数字组合成两个两位数,判断这两个数的乘积是否等于原四位数. 组合:1.两个数字之间是无序的,即21*60和60*21是等价的 2.十位

例题:打印乘法口诀。可能大家一看有点难,但只要理解for 循环嵌套,两层循环,外层循环行数,里层循环列数,搞清楚行数和列数之间的关系,就可以轻松做出这道题

namespace 打印乘法口诀{    class Program    {        static void Main(string[] args)        {            for (int i = 1; i <=9; i++)//行数循环九次,            {                for (int j = 1; j<=i; j++)//当i等于1的时候,j等于1,                {                    Consol

hdu 5104 Primes Problem(prime 将三重循环化两重)

//宁用大量的二维不用量小的三维 #include <iostream> #include<cstdio> #include<cstring> using namespace std; int prime[1000],num[10005]; int Cout; void initPrime() { for(int i=2;i<=10000;i++) num[i]=1; for(int i=2;i<=10000;i++) { if(num[i]) { for(

矩阵k次幂 采用三重循环

#include<iostream> using namespace std; int main() { int n,k; long long a[11][11],b[11][11],c[11][11]; while(cin>>n>>k) { int x=k; for(int i=0;i<n;i++) for(int j=0;j<n;j++) { cin>>a[i][j]; b[i][j]=a[i][j]; c[i][j]=0; } k=k-1;

比赛分组 功能描述:两个乒乓球队进行比赛,各出三人。 甲队为A、B、C三人,乙队为X、Y、Z 三人,已经抽签决定了比赛名单。 已知A 不和X 比,C 不和X、Z 比,请问比赛名单是什么。(用到了三重循环)

当时看到题目的时候自己就晕了,不懂什么意思,做出来的结果竟然是一个人比好几个人,当时还觉得一个人可以打几场呢!==!后来求助大神得到了答案,共勉一下吧~~ public static void main(String[] args) { for(int a = 1 ;a<=3;a++){ for(int b = 1 ;b<=3;b++){ for(int c = 1 ;c<=3;c++){ if(a != 1 && c != 1 && c != 3 &am

POJ 1019 Number Sequence (循环递增序列的的第K个值)

Number Sequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35823   Accepted: 10340 Description A single positive integer i is given. Write a program to find the digit located in the position i in the sequence of number groups S1S2..

Codeforces - Tag::SP 大合集 [占坑]

完蛋了要挂科了,赶紧更新个专题冷静一下 PS.仅按A题人数顺序更新,选择性忽略部分题 PPS.这个专题应该比较休闲吧 520B 给定初始n和目标m,存在两种操作\(-1\)和\(×2\),要求最少操作次数 无脑解法是BFS,不能解决稍大的规模 当n>m时,输出n-m 否则逆向处理,转换为m到n的最小操作次数,存在两种操作\(+1\)和\(/2\)(后者只能在偶数时操作) 由\((m+1+1)/2=m/2+1\)得尽量多的/2操作可以减少操作次数 因此若操作当前的\(m?\)是偶数时尽量/2,直到

HD1385Minimum Transport Cost(Floyd + 输出路径)

Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9109    Accepted Submission(s): 2405 Problem Description These are N cities in Spring country. Between each pair of cities

hdu 2066 一个人的旅行(裸dijkstra)

http://acm.hdu.edu.cn/showproblem.php?pid=2066 求多源多汇的最短路,n最大为1000,floyd三重循环会超时.继续dijkstra吧. #include <stdio.h> #include <algorithm> #include <set> #include <map> #include <vector> #include <math.h> #include <string.h