数据结构——Floyd算法——顺序存储

#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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值