最短路(FLOYD)

题目描述

给n个点的有向图,和q次询问,每次询问两点间最短路的长度。

第一行两个数n和q,接下来一个n×n的矩阵,第i行第j列的数表示从i到j的边权,接下来q行,每行两个数i和j,表示询问从i到j的最短路。

n≤50,q≤1000,边权≤2,000,000,000。

样例输入

3 6
0 1 100
1 0 100
1 1 0
1 2
1 3
2 1
2 3
3 1
3 2

样例输出

1
100
1
100
1
1

 很明显,这是一道多源最短路(FLOYD),模版题主要就是讲一下FLOYD的思路。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <iostream>
#define N 510
using namespace std;
typedef long long ll;
ll n,q,a,b;
ll mp[N][N];
int main() {
    scanf("%lld%lld",&n,&q);
    for (ll i = 1 ; i <= n ; i++)
    for (ll j = 1 ; j <= n ; j++) 
    {
        scanf("%lld",&mp[i][j]); //数组存图
        if (i == j)
            mp[i][j] = 0;
    }
    for (ll k = 1 ; k <= n ; k++)
        for (ll i = 1 ; i <= n ; i++)
            for (ll j = 1 ; j <= n ; j++)
                mp[i][j] = min(mp[i][k] + mp[k][j],mp[i][j]); //FOLYD的基本思路
                                    //当前的距离与中间的一个点做媒介,比较他们的大小找最小的
for (ll i = 1 ; i <= q ; i++) { scanf("%lld%lld",&a,&b); printf("%lld\n",mp[a][b]);//输出数据 } return 0; }

 

posted @ 2018-03-02 20:17  Zhoier  阅读(286)  评论(0编辑  收藏  举报