• Floyed算法


    (原来弗洛伊德不止是写xhs<梦的解析>啊哈哈哈哈)

    嘿嘿

    (好哦不是一个人)

    求任意两点之间的最短路径

    有些城市之间有公路,有些城市之间则没有请注意这些公路是单向的。我们现在需要求任意两个城市之间的最短路程,也就是求任意两个点之间的最短路径。这个问题这也被称为“多源最短路径”问题。

    根据我们以往的经验,如果要让任意两点(例如从顶点a点到顶点b)之间的路程变短,只能引入第三个点(顶点k),并通过这个顶点k中转即a->k->b,才可能缩短原来从顶点a点到顶点b的路程。那么这个中转的顶点k是1~n中的哪个点呢?甚至有时候不只通过一个点,而是经过两个点或者更多点中转会更短,即a->k1->k2b->或者a->k1->k2…->k->i…->b。

    其实说白了,就是把所有中转遍历一下,找找最短的.
     
    存数:
    现在需要一个数据结构来存储图的信息,我们仍然可以用一个4*4的矩阵(二维数组e)来存储。比如1号城市到2号城市的路程为2,则设e[1][2]的值为2。2号城市无法到达4号城市,则设置e[2][4]的值为∞。另外此处约定一个城市自己是到自己的也是0,例如e[1][1]为0.
    1 核心代码:
    2 for(k=1;k<=n;k++)
    3     for(i=1;i<=n;i++)
    4     for(j=1;j<=n;j++)
    5     if(e[i][j]>e[i][k]+e[k][j])
    6                      e[i][j]=e[i][k]+e[k][j];
    整体代码:
    标注:所有值初始值为正无穷  0xffffffff 或者直接找个比较大的值就好
     1 #include
     2     int main()
     3     {
     4     int e[10][10],k,i,j,n,m,t1,t2,t3;
     5     int inf=99999999; //用inf(infinity的缩写)存储一个我们认为的正无穷值
     6     //读入n和m,n表示顶点个数,m表示边的条数
     7         scanf("%d %d",&n,&m);
     8     //初始化
     9     for(i=1;i<=n;i++)
    10     for(j=1;j<=n;j++)
    11     if(i==j) e[i][j]=0;
    12     else e[i][j]=inf;
    13     //读入边
    14     for(i=1;i<=m;i++)
    15         {
    16             scanf("%d %d %d",&t1,&t2,&t3);
    17             e[t1][t2]=t3;
    18         }
    19     //Floyd-Warshall算法核心语句
    20     for(k=1;k<=n;k++)
    21     for(i=1;i<=n;i++)
    22     for(j=1;j<=n;j++)
    23     if(e[i][j]>e[i][k]+e[k][j] )
    24                         e[i][j]=e[i][k]+e[k][j];
    25     //输出最终的结果
    26     for(i=1;i<=n;i++)
    27         {
    28     for(j=1;j<=n;j++)
    29             {
    30                 printf("%10d",e[i][j]);
    31             }
    32             printf("
    ");
    33         }
    34     return 0;
    35     }

    注意:负权值没有最短路!!!!!!!

    (负权值就是说,有条路的长度是个负数)

    因为负数的话会一直递归减少,所以是不行的!!!!

  • 相关阅读:
    【SQL】含有NULL值的排序
    【SQL】结构化查询语言
    【Oracle】体系结构
    【PL/SQL】匿名块、存储过程、函数、触发器
    【Linux】VMware安装VMware Tools工具
    【SQL】INTERVAL YEAR TO MONTH 和 INTERVAL DAY TO SECOND
    Tornado源码浅析
    【Python之路】特别篇--property()函数 和 @property 装饰符
    【Python之路】特别篇--生成器(constructor)、迭代器(iterator)、可迭代对象(iterable)
    【Python之路】特别篇--基于领域驱动模型架构设计的京东用户管理后台
  • 原文地址:https://www.cnblogs.com/zhmlzhml/p/12950663.html
Copyright © 2020-2023  润新知