#include<stdio.h>
#include"structure.c"
#define MaxVerTex 100
typedef char Dis;
//输出floyd中的矩阵
void printDis_Floyd(AMGraph *G, int a[MaxVerTex][MaxVerTex]){
for (int i = 0; i < G->vexsNum; i++)
{
for (int j = 0; j < G->vexsNum; j++)
{
/* code */
printf("%5d ",a[i][j]);
}
printf("\n");
}
}
void printPathVerTex_Floyd(AMGraph *G, Dis a[MaxVerTex][MaxVerTex]){
for (int i = 0; i < G->vexsNum; i++)
{
for (int j = 0; j < G->vexsNum; j++)
{
/* code */
printf("%5c ",a[i][j]);
}
printf("\n");
}
}
void floyd(AMGraph *G){
//创建两个数组存放数据
//存放两点之间最短距离的二维数组
int dis[MaxVerTex][MaxVerTex];
//存放两点之间最短距离的中间点
Dis path[MaxVerTex][MaxVerTex];
//对二维数组进行赋值,等于邻接矩阵中每天边的值
for (int i = 0; i < G->vexsNum; i++)
{
for (int j = 0; j < G->vexsNum; j++)
{
if (i==j)
{
dis[i][j]=0;
}else
{
dis[i][j]=G->arcs[i][j];
path[i][j]='X';
}
}
}
//将中间路径节点 集合 全部赋值为-1,指示两点之间要么没有路要么没有中间节点
for (int i = 0; i < G->vexsNum; i++)
{
for (int j = 0; j < G->vexsNum; j++)
{
path[i][j]='X';
}
}
//进行floyd的主要三重循环
// 1、对每个节点进行遍历,将这个点插入每两个中,看会不会形成更小的距离
for (int v = 0;v < G->vexsNum; v++)
{
for (int i = 0; i < G->vexsNum;i++)
{
for (int j = 0; j < G->vexsNum; j++)
{
if (v!=i&&v!=j && i!=j)
{
//2、如果将值插进去之后,让两点变得更短,那么就替代他们
if (G->arcs[i][j]>G->arcs[i][v]+G->arcs[v][j])
{
G->arcs[i][j]=G->arcs[i][v]+G->arcs[v][j];
path[i][j]=G->vexs[v];
}
}
}
}
}
// 对两个数组进行打印
// 最短距离值的数组
printMaxtrix(G);
printf("\n");
printPathVerTex_Floyd(G,path);
}
//main
int main(int argc, char const *argv[])
{
AMGraph xxx;
initialMatrix(&xxx);
CreateAMGraph(&xxx,7,12);
printf("图的邻接矩阵:\n");
printMaxtrix(&xxx);
printf("下面是Floyd:\n\n");
floyd(&xxx);
return 0;
}
数据结构——Floyd算法——顺序存储
最新推荐文章于 2022-03-27 18:56:36 发布