• Floyd算法小结


    Floyd算法是一种用于寻找给定的加权图中多源点之间最短路径的算法,算法流程如下所示:
    1:从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。
    2:对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比已知的路径更短。如果是更新它。
    把图用邻接矩阵G表示出来,如果从Vi到Vj有路可达,则G[i,j]=d,d表示该路的长度;否则G[i,j]=无穷大。定义一个矩阵D用来记录所插入点的信息,D[i,j]表示从Vi到Vj需要经过的点,初始化D[i,j]=j。把各个顶点插入图中,比较插点后的距离与原来的距离,G[i,j] = min( G[i,j], G[i,k]+G[k,j] ),如果G[i,j]的值变小,则D[i,j]=k。在G中包含有两点之间最短道路的信息,而在D中则包含了最短通路径的信息。
     
    对于Floyd算法的代码实现,如下所示(C语言版):

    #include<stdio.h>
    #include<stdlib.h>
    #define max 100000000
    int d[1000][1000],path[1000][1000];

    int main()
    {
    int i,j,k,m,n;
    int x,y,z;
    int sta,end;
    scanf("%d%d",&m,&n); //m为结点数,n为边数

    //邻接矩阵和路径矩阵初始化化
    for(i=1;i<=m;i++){
    for(j=1;j<=m;j++)
    {
    d[i][j]=max;
    path[i][j]=j;
    }
    }


    //读入边信息
    for(i=1;i<=n;i++){
    scanf("%d%d%d",&x,&y,&z);
    d[x][y]=z;
    d[y][x]=z;
    }


    //算法的核心部分,注意循环嵌套的顺序
    for(k=1;k<=m;k++)
    for(i=1;i<=m;i++)
    for(j=1;j<=m;j++)
    {
    if(d[i][k]+d[k][j]<d[i][j]){
    d[i][j]=d[i][k]+d[k][j];
    path[i][j]=path[i][k];
    }
    }


    scanf("%d%d",&sta,&end); //sta为起点,end为终点
    for(i=1;i<=m;i++){
    for(j=1;j<=i;j++){
    if(i!=j)
    printf("%d->%d:%d ",i,j,d[i][j]);
    }
    }
    i=sta;
    while(sta!=end){
    printf("%d->",sta);
    sta=path[sta][end];
    }
    printf("%d:%d",end,d[i][end]);
    system("pause");
    return 0;
    }

  • 相关阅读:
    35.使用拦截器实现权限验证
    34.TokenInterceptor防止表单重复提交
    33.使用默认的execAndWait拦截器
    32.使用来MethodFilterInterceptor灵活拦截
    31.自定义拦截器
    sql 学习笔记 档
    AVR文章7课时:动态数字化控制
    MapReduce 规划 系列的12 使用Hadoop Streaming技术集成newLISP文字
    左右TS分析流
    Java达到MySQL数据库备份(两)
  • 原文地址:https://www.cnblogs.com/bywallance/p/5253245.html
Copyright © 2020-2023  润新知