• Floyd算法 及其运用


     

     1 #include<stdio.h>
     2 int dis[601][601];
     3 int path[601][601];
     4 void floyd(int n)
     5 {
     6     for(int k=1;k<=n;k++)
     7     {
     8         for(int i=1;i<=n;i++)
     9         {
    10             for(int j=1;j<=n;j++)
    11             {
    12                 printf("d[%d][%d]=%d ",i,j,dis[i][j]);
    13                 printf("d[%d][%d]=%d d[%d][%d]=%d
    ",i,k,dis[i][k],k,j,dis[k][j]);
    14                 
    15                 if(dis[i][k]+dis[k][j]<dis[i][j])
    16                 {
    17                     dis[i][j]=dis[i][k]+dis[k][j];
    18                     printf("%d
    
    ",dis[1][2]);
    19                     path[i][j]=path[k][j];
    20                 }
    21             }
    22         }
    23     }
    24 }
    25 
    26 
    27 void find(int a,int b)
    28 {
    29     int p[100],k=0;
    30     p[k++]=b;
    31     while(path[a][b]!=a)
    32     {
    33         p[k++]=path[a][b];
    34         b=path[a][b];
    35     }
    36     p[k++]=a;
    37     for(int i=k-1;i>=0;i--)
    38     {
    39         if(i!=0)
    40         printf("%d -> ",p[i]);
    41         else
    42             printf("%d
    ",p[i]);
    43     }
    44     printf("%d",dis[1][2]);
    45     printf("
    ");
    46 }
    47 int main()
    48 {
    49     int n,m;
    50     scanf("%d %d",&n,&m);
    51     int a,b,k,i,j;
    52     for(i=1;i<=n;i++)
    53         for(j=1;j<=n;j++)
    54         {
    55             path[i][j]=i;
    56             dis[i][j]=100000;
    57         }
    58     for(i=1;i<=m;i++)
    59     {
    60         scanf("%d %d %d",&a,&b,&k);
    61         dis[a][b]=dis[b][a]=k;
    62     }
    63     floyd(n);
    64     find(1,2);
    65     return 0;
    66 }
    floyd算法实现示例代码

     

    h

             通过一个图的权值矩阵求出它的每两点间的最短路径矩阵
    Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B。所以,我们假设Dis(AB)为节点A到节点B的最短路径的距离,对于每一个节点X,我们检查Dis(AX) + Dis(XB) < Dis(AB)是否成立,如果成立,证明从A到X再到B的路径比A直接到B的路径短,我们便设置Dis(AB) = Dis(AX) + Dis(XB),这样一来,当我们遍历完所有节点X,Dis(AB)中记录的便是A到B的最短路径的距离
     
  • 相关阅读:
    防止头文件的重复包含问题
    git常用命令
    redis
    linux常用操作
    数据库安装
    mysql修改表结构
    mysql 忘记root密码及授权访问
    mysql连表查询
    mysql 存取ip方法
    php批量修改表结构
  • 原文地址:https://www.cnblogs.com/zeze/p/floyd.html
Copyright © 2020-2023  润新知