Floyd算法
Posted fuyun_boy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Floyd算法相关的知识,希望对你有一定的参考价值。
floyd算法,关键语句只有4行的最短路算法(强行好多行)。算法的具体实现方法是枚举你两个点的起点和终点,然后枚举中间点。如果你枚举的 起点到中间点+中间点到终点 比起点到中间点小,就将起点到终点的权值替换成 起点到中间点+中间点到终点的权值,这样一直枚举下去到最后的时候就可以计算出起点到终点的权值,时间复杂度O(n3).
1 void Floyed() 2 { 3 for(int k=1;k<=N;k++){ 4 for(int i=1;i<=N;i++){ 5 for(int j=i;j<=N;j++){ 6 if( MAP[i][j]>MAP[i][k]+MAP[k][j] ) 7 MAP[i][j]=MAP[i][k]+MAP[k][j]; 8 } 9 } 10 } 11 }
第5行 j 可以从 i 开始而不用从 1 开始,因为你已经从 1 枚举到了 j 没必要向回枚举(结果是一样的或者说不影响结果)。
数组在使用前一定要先赋值为正无穷。
以洛谷1359为例:http://www.luogu.org/problem/show?pid=1359#sub
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 #define MAX 205 6 //====================================================== 7 int N,MAP[MAX][MAX]; 8 //====================================================== 9 void init(); 10 void Floyed(); 11 //====================================================== 12 void Floyed() 13 { 14 for(int k=1;k<=N;k++){ 15 for(int i=1;i<=N;i++){ 16 for(int j=i;j<=N;j++){ 17 if( MAP[i][j]>MAP[i][k]+MAP[k][j] ) 18 MAP[i][j]=MAP[i][k]+MAP[k][j]; 19 } 20 } 21 } 22 } 23 //====================================================== 24 void init() 25 { 26 cin>>N; 27 memset( MAP , 0x3f3f3f3f , sizeof(MAP) ); 28 for(int i=1;i<=N;i++){ 29 for(int j=i+1;j<=N;j++){ 30 cin>>MAP[i][j]; 31 } 32 } 33 } 34 //====================================================== 35 int main() 36 { 37 init(); 38 Floyed(); 39 cout<<MAP[1][N]; 40 //system("pause"); 41 return 0; 42 }
以上是关于Floyd算法的主要内容,如果未能解决你的问题,请参考以下文章