#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MaxSize 50
#define INF 99999
typedef struct MGraph{
char vertex[MaxSize]; //顶点
int weight[MaxSize][MaxSize]; //权值
int vexnum,arcnum; //定点数,边数
};
/**
算法思想:
Floyd是基于动态规划的算法,是一种以局部到整体的解决问题的办法。
首先,先把每两个顶点之间的弧的权值都填好,相当于存储好每个弧的长度
以便下面中转点的查找。
然后遍历每一个点,轮到那个点的时候,都以那个点为中转点,
比较ij两点之间的距离和ik+kj之间的距离
**/
void Floyd(MGraphW G,int *A[],int *path[]){
for(int i = 0;i < G.vexnum;i++){
for(int j = 0;j < G.vexnum;j++){
A[i][j] = G.weight[i][j];
path[i][j] = =-1;
}
} //填好每两个点之间的值(距离)
//然后将它们的中转点置为-1
for(int k = 0;k < G.vexnum;k++){ //这个k是中转点
for(int i = 0;i < G.vexnum;i++){
for(int j = 0;i < G.vexnum;j++){
if(A[i][j] > A[i][k] + A[k][j]){
A[i][j] = A[i][k] + A[k][j];
path[i][j] = k;
}
}
}
}
}
/**
总结:
1.时间复杂度:O(|V|^3)
2.Floyd算法允许图中带负权值的边,但不允许有包含负权值的边组成的回路
3.适用于带权有、无向图
**/