zoukankan      html  css  js  c++  java
  • 弗洛伊德算法

    1.算法适用的问题

       这个算法是通过一个图的权值矩阵来求解任意两个点之间的最短权值矩阵。通俗的说也就是求解任意两个点直接的最短路径。
    2.使用的是什么样的数据结构
      这里个算法使用的就是用数组存储数据,用一个数组来保存权值,另外一个数组来保存经过每一个最短路径的点。
    3.具体的思路
      具体的思路是通过遍历所有的点,使用了一个类似于状态转移方程,就是每次都比较一个原值和其他的路径组成的最短路径,从而得出最短的路径的权值。遍历是通过三个互相嵌套的for循环来表示的。这三个循环是有一定的规则的,这里里面的两个循环的是用来遍历所有的点,最外层是用来挑选点的,这里的挑选点的话是挑选有没有哪一个点能够让两个点之间的距离变得更加的小。
     
     
    源代码
    #include<cstdio>
    #include<cstring>
    #include<iostream>
     
    using namespace std;
     
    const int INF=100000;
     
    int main()
    {
        int m,n;
        int dic[100][100],pic[100][100];
        while(scanf("%d%d",&m,&n)==2)
        {
            int i,j,k;
            for(i=1;i<=m;i++)
            {
                for(j=1;j<=m;j++)
                {
                    dic[i][j]=INF;
                    pic[i][j]=j;
                }
            }
            int x,y,z;
            for(i=0;i<n;i++)
            {
                scanf("%d%d%d",&x,&y,&z);
                dic[x][y]=z;
                dic[y][x]=z;
            }
            for(k=1;k<=m;k++)
            {
                for(i=1;i<=m;i++)
                {
                    for(j=1;j<=m;j++)
                    {
                        if(dic[i][j]>dic[i][k]+dic[k][j])
                        {
                            dic[i][j]=dic[i][k]+dic[k][j];
                            pic[i][j]=pic[i][k];
                        }
                    }
                }
            }
            for(i=1;i<=m;i++)
            {
                for(j=1;j<=m;j++)
                {
                    if(i!=j)
                    printf("%d->%d:%d ",i,j,dic[i][j]);
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    Struts2-result配置结果视图
    Struts2 -action处理业务请求
    struts 2
    mvc模式
    vue之webpack安装配置vue
    vue之webpack
    文件上传
    LinkedList详解
    ArrayList详解
    HashMap详解
  • 原文地址:https://www.cnblogs.com/yewa/p/7243568.html
Copyright © 2011-2022 走看看