Floyd算法思想:
1.初始化矩阵(i,j连接则矩阵的值为边的代价,否则为MAX)
2.计算 i 经过 k 到 j 的最短路径map[i,j]:=min{map[i,k]+map[k,j],map[i,j]}并保存路径
时间复杂度:O(n^3)
空间复杂度:T(n^2)
代码:
void Floyd(int n)//n为节点数,节点从1开始
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int temp=Metrix[i][k]+Metrix[k][j];
if(Metrix[i][j]>temp)
{
Metrix[i][j]=temp;
path[i][j]=path[i][k];//初始path[i][j]=j;
}
}
}
}
}
例题
http://acm.hdu.edu.cn/showproblem.php?pid=1385
<pre name="code" class="cpp">
#include <iostream>
#include<stdio.h>
#define N 120
#define MAX 0x3ffffff
using namespace std;
int Metrix[N][N];
int path[N][N];
int tax[N];
void Floyd(int n)
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int temp=Metrix[i][k]+Metrix[k][j]+tax[k];
if(Metrix[i][j]>temp)
{
Metrix[i][j]=temp;
path[i][j]=path[i][k];
}
else if(Metrix[i][j]==temp&&path[i][j]>path[i][k])path[i][j]=path[i][k];
}
}
}
}
int main()
{
int n;
while(cin>>n&&n)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>Metrix[i][j];
if(Metrix[i][j]==-1)Metrix[i][j]=MAX;
path[i][j]=j;
}
}
for(int i=1;i<=n;i++)
{
cin>>tax[i];
}
Floyd(n);
int src,des;
while(scanf("%d%d",&src,&des)){
if(src==-1&&des==-1) break;
printf("From %d to %d :\n",src,des);
printf("Path: ");
int u = src;
printf("%d",u);
while(u != des){
printf("-->%d",path[u][des]);
u = path[u][des];
}
puts("");
printf("Total cost : %d\n\n", Metrix[src][des]);
}
}
return 0;
}