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;
}
算法效率比较搓,但是可以找出正权图中每两个点之间的最短路径。
代码贴完了 求挑错,求打脸!