弗洛伊德算法精解与模板

弗洛伊德算法是把图中每两个节点之间的最短路都求出来,有点就是之后可以查询没量个点之间距离且不用重复计算。需要两个二维数组,三层for循环。

思想是按顺序遍历每一条路径,找到与之等价并且更短的其他路径存入这个路径位置。

给出代码和样例图


#include<cstdio>
#include<cstring>
#include<algorithm>
#define MM 0x3f3f3f3f
#define size 1002
using namespace std;
int n,m,j,i,k,l;
int a[size][size],b[size][size];
int main()
{
    while(~scanf("%d%d",&n,&m)&&n+m)//输入两个数,n点的总数,m边的总数
    {
        for(i=0; i<size; i++)
            for(j=0; j<size; j++)
            {
                if(i!=j)
                    a[i][j]=MM;
                else
                    a[i][j]=0;
                b[i][j]=j;
            }//初始化两个二维数组

        for(i=0; i<m; i++)
        {
            scanf("%d%d%d",&j,&k,&l);
            a[j][k]=l;
            a[k][j]=l;
        }//输入路经端点和路径长

        for(i=1; i<=n; i++)
        {
            for(j=1; j<=n; j++)
            {
                if(i==j)
                continue;
                if(a[i][j]>=MM)
                continue;
                for(k=1; k<=n; k++)
                {
                    if(a[j][k]>a[j][i]+a[i][k])
                    {
                        a[j][k]=a[j][i]+a[i][k];
                        b[j][k]=b[j][i];
                    }
                }
            }
        }

        scanf("%d",&i);//查询的问题数
        while(i--)
        {
            scanf("%d%d",&j,&k);//输入两个点输出之间的最短路
            if(a[j][k]<MM)
            printf("%d\n",a[j][k]);
            else
            printf("-1\n");//两点之间没有路
        }
        printf("结束,\n输入下一个图\n");
    }
    return 0;
}

/**

21 42
1 2 3
1 3 5
1 8 4
2 3 2
2 4 9
2 6 5
3 8 2
3 7 1
3 11 8
3 6 1
4 6 2
4 12 7
4 5 6
5 13 4
6 11 2
6 12 1
7 8 3
7 10 2
7 11 2
7 18 5
8 9 1
8 10 5
9 19 2
9 10 4
10 19 7
10 18 2
11 18 3
11 14 1
11 17 2
12 14 4
12 13 3
13 15 3
14 17 10
14 15 2
15 16 2
16 17 1
16 21 3
17 21 4
18 19 6
18 20 2
19 20 3
20 21 1

*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值