为什么Floyd算法中k必须放在最外层
来源:互联网 发布:linux添加用户密码 编辑:程序博客网 时间:2024/05/17 08:56
https://www.zhihu.com/question/30955032 可以看下知乎这个问题。 我之前一直以为我明白了这个算法,结果发现自己只是会打模版而已,这个算法的实际是动态规划
这个解释的非常好啊,就是知乎上的最高票答案,你要知道他是从上一层k转移过来的所以当前的f[i][j]都应该是完成上一层动态规划的,如果k不是在最外层,那么f[i][j]就不是完成上一层动态规划的后的状态,有可能有的点没有经过k-1这个点的松弛。
我尝试了一下,开三维数组把k放在最内层,但有时会更新不完,如POJ 3660,我用了如下代码也A掉了,但正确的写法仍然是要把k放在最外层,注意注意
#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<vector>#include<string>#include<algorithm>using namespace std;const int MAX_V = 110;bool e[MAX_V][MAX_V][MAX_V];int N,M;void floyd(){ for(int l=1;l<=3;l++) for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) for(int k=1;k<=N;k++) if(e[k-1][i][k] && e[k-1][k][j]) e[k][i][j] = true; else e[k][i][j] = e[k-1][i][j];}int main(void){ while(scanf("%d %d",&N,&M) != EOF){ int x,y; memset(e,false,sizeof(e)); for(int i=1;i<=M;i++){ scanf("%d %d",&x,&y); e[0][x][y] = true; } floyd();// for(int i=1;i<=N;i++){// for(int j=1;j<=N;j++){// printf("%d ",e[N][i][j]);// }// printf("\n");// } int res = 0; for(int i=1;i<=N;i++){ int sum = 0; for(int j=1;j<=N;j++){ if(i == j) continue; if(e[N][i][j] || e[N][j][i]) sum++; } if(sum == N-1) res++; } printf("%d\n",res); } return 0;}
阅读全文
0 0
- 为什么Floyd算法中k必须放在最外层
- 数据结构-图(四)-最短路径之Floyd(为什么k写在最外层)
- Floyd算法 最外层 迭代顺序 关系
- 在多重循环中,应当将最长的循环放在最内层,最短的循环放在最外层
- 在构造器中为什么this或super必须放在第一行?
- 在构造器中为什么this或super必须放在第一行?
- 在构造器中为什么this或super必须放在第一行?
- 在构造器中为什么this或super必须放在第一行?
- Spring boot 的主application要放在最外层,否则会报错
- 为什么js放在head部分没有反应,必须放在body部分下才会起作用
- wait()为什么放在 while中
- 为什么wait()一定要放在循环中
- Android4.0网络操作必须放在子线程中
- python中声明编码方式必须放在第一行
- 自定义UIMenuController监听的方法必须放在控制器中
- 最短路-Floyd算法
- 最短路算法(Floyd)
- 最短路-Floyd算法
- 导航栏添加按钮
- 决策树ID3
- Menu菜单(常用型)
- linux Oracle 定时自动备份
- 请别把加班说的那么“高大上”
- 为什么Floyd算法中k必须放在最外层
- jdk中栈的实现
- 基于SNMP的网络管理软件设计方案和实现
- CentOS7 Failed to start LSB: Bring up/down解决方法
- .net面试宝典
- [Android Studio] android 去掉按钮自带阴影效果
- 精简“入口”延缓“拥堵”Discuz!教你如何用最经济的方式抵御CC攻击
- 多态的好处与弊端
- java通过url(http)存取远端文件