最短路径之folyd算法

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;
}

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

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



你可能感兴趣的:(最短路径之folyd算法)