佛洛伊德算法时间复杂度为O(n^3),其中n为顶点的个数。

Floyd可求出任何一对顶点之间的最短路径。允许图中有带负权值的边,但是不允许有包含带负权值的边组成的回路。

#include <iostream>
using namespace std;

#define Maxsize 100
typedef char VertexType;
typedef int EdgeType;

typedef struct{
	VertexType Vex[Maxsize];
	EdgeType edge[Maxsize][Maxsize];
	int vexnum,arcnum;
}MGraph;

void Floyd(MGraph G,int A[][Maxsize],int path[][Maxsize]){
	int i,j,k;
	for(i=0;i<G.vexnum;i++)
		for(j=0;j<G.vexnum;j++){
			A[i][j]=G.edge[i][j];	//初始化
			path[i][j]=-1; 
		}
	for(k=0;k<G.vexnum;k++)	//经过k顶点 
		for(i=0;i<G.vexnum;i++)
			for(j=0;j<G.vexnum;j++)	//i->j的距离
				if(A[i][j]>A[i][k]+A[k][j]){
					A[i][j]=A[i][k]+A[k][j];
					path[i][j]=k;
				} 
}