弗洛伊德算法

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\n",i,j,dic[i][j]);
            }
        }
    }
    return 0;
}
posted @ 2017-07-27 10:46  静静的逻辑  阅读(856)  评论(0编辑  收藏  举报