最短路径之folyd算法

来源:互联网 发布:dns 端口号 编辑:程序博客网 时间:2024/05/18 17:26

Floyd算法

floyd算法采用的是(松弛技术),对在i和j之间的所有其他点进行一次松弛。 

If D[i,j]>D[i,k]+D[k,j] Then

D[I,j]:=D[I,k]+D[k,j];

时间复杂度:为O(n^3);


算法描述: 

a) 初始化:D[u,v]=A[u,v]

b) For k:=1 to n

For i:=1 to n

For j:=1 to n

If D[i,j]>D[i,k]+D[k,j] Then

D[I,j]:=D[I,k]+D[k,j];

c) 算法结束:D即为所有点对的最短路径矩阵


代码如下: 

#include<iostream>#include<fstream>#include<stdlib.h>using namespace std;int graph[6][6];int path[6][6];#define INF   1000   void show()//显示graph[][]
 {     for(int i=1;i<=6;i++) {     for(int j=1;j<=6;j++) {    cout<<graph[i][j]<<"  "; }cout<<endl; } }int main(int argc, char* argv[]){//图的初始化      ifstream in("a.txt");  //文件中每行3个数 点i ,点 j,weight[i][j]   int n ,i,j,k;   in>>n;//有n条边       for( i=1;i<6;i++)   {      for(int j=1;j<6;j++)  {     if(i==j) {     graph[i][j]=0; } else graph[i][j]=INF;  }   }   for (k=0  ;k<n;k++)   {         in>>i>>j;      in>>graph[i][j];  graph[j][i]=graph[i][j];   }  ///floyd  图中点的编号1 ~5         for(  i=1;i<6;i++) {   for(int j=1;j<6;j++) {    for(int k=1;k<6;k++)  {      if((i!=j)&&(i!=k)&&(j!=k))//保证遍历的点 不是ij本身    {     if(graph[i][k]+graph[k][j]<graph[i][j]) {       graph[i][j]=graph[i][k]+graph[k][j]; }}  } } }    show();system("PAUSE");return 0;}

其实这个算法很挫,很简单,算法效率也比较搓,但是可以找出正权图中每两个点之间的最短路径。

代码贴完了 求挑错,求打脸!