关闭

弗洛伊德算法模板

369人阅读 评论(0) 收藏 举报
分类:

弗洛伊德算法求无向图最短路

<strong>#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
*/</strong>


2
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:64795次
    • 积分:3376
    • 等级:
    • 排名:第10494名
    • 原创:240篇
    • 转载:1篇
    • 译文:1篇
    • 评论:18条
    最新评论