/**
*2018.9.30 10:06
*floyd最短路径算法(任意两点间的最短路径,与dijkstra算法都适用于连通图)
*path保存从某点a到某点b的下一个顶点的标号
*/
#include<stdio.h>
#define MAX 100
//表示两点之间没有路径
#define MAX_WEIGHT 1000
typedef struct Matrix {
char e[MAX];
int edge[MAX][MAX];
int v_num, e_num;
}Matrix;
void floyd(Matrix *g, int path[][MAX], int cost[][MAX]);
void printPath(int path[][MAX], int source, int terminus);
int main(void) {
Matrix g = {
"hhhaah",
{{MAX_WEIGHT, 5,MAX_WEIGHT,7},
{MAX_WEIGHT,MAX_WEIGHT,4,2},
{3,3,MAX_WEIGHT,2},
{MAX_WEIGHT,MAX_WEIGHT,1,MAX_WEIGHT},
},
4,8
};
int path[MAX][MAX];
int cost[MAX][MAX];
floyd(&g, path, cost);
printPath(path ,0 , 0);
putchar('\n');
system("pause");
return 0;
}
void floyd(Matrix *g, int path[][MAX], int cost[][MAX]) {
int i, j, k;
for (i = 0; i < g->v_num; ++i){
for (j = 0; j < g->v_num; ++j) {
path[i][j] = -1;
cost[i][j] = g->edge[i][j];
}
}
for (k = 0; k < g->v_num; ++k) {
for (i = 0; i < g->v_num; ++i) {
for (j = 0; j < g->v_num; ++j) {
if ( i != j && cost[i][j] > cost[i][k] + cost[k][j]) {
path[i][j] = k;
cost[i][j] = cost[i][k] + cost[k][j];
}
}
}
}
}
void printPath(int path[][MAX], int source, int terminus) {
printf("%d,", source);
int mid = path[source][terminus];
while (mid != -1) {
printf("%d,", mid);
mid = path[mid][terminus];
}
printf("%d,", terminus);
}
弗洛伊德算法
最新推荐文章于 2021-08-08 02:31:36 发布