题目描述
给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; }