1505.用弗洛伊德算法求赋权图的两点间的最短路径的长度
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
用弗洛伊德算法求任意两点间的最短路径的长度,
输入
先输入一个小于100的正整数n,然后的n行输入图的邻接矩阵(10000表示无穷大,即两点之间没有边),之后再输入一个小于100的正整数m,最后的m行每行输入两个不同的0到n-1之间的整数表示两个点,
输出
用弗洛伊德算法求任意两点间的最短路径的长度,并输出这些两个点之间的最短路径的长度。
输入样例
4
0 2 10 10000
2 0 7 3
10 7 0 6
10000 3 6 0
2
0 2
3 0
输出样例
9
5
# include <iostream>
# include <cstdio>
# include <cmath>
# include <cctype>
# include <vector>
#include <string>
#include <algorithm>
using namespace std;
#define MAXSIZE 1000
//floyd算法
int map[MAXSIZE][MAXSIZE];//用来存储图
int n;//全局存储节点数目
void insertl();
void floyd();
void outputl();
int main()
{
insertl();
floyd();
outputl();
}
void insertl()
{
cin >> n;
for (int u = 0; u < n;u++)
{
for (int i = 0; i < n; i++)
{
int temp;
cin >> temp;
map[u][i] = temp;
}
}
}
void floyd()
{
//弗洛伊德算法是一种DP算法
//可以理解为局部的最优解整合起来就可以构成最后的最优解
//这里要讨论的局部就是 两点之间如何才能最短 只能在两个点之间添加一个第三点
//如果加入了第三个点之后仍然是最短的时候就更新原本两个点之间的距离
//同理 对于任意两点a b之间的最短点 加入ac,cb 可以保证ac是a到c的最短距离 两个最短距离加起来一定也是最短距离
//从而构成了局部最优解
for (int i = 0; i < n;i++)
{
for (int u = 0; u < n; u++)
{
for (int j = 0; j < n; j++)
{
if (map[i][u] > map[j][u] + map[i][j])
{
//搜索所有的点 尝试缩短两个点之间的距离
map[i][u] = map[j][u] + map[i][j];
}
}
}
}
}
void outputl()
{
int p;
cin >> p;
for (int k = 0; k < p; k++)
{
int a, b;
cin >> a >> b;
cout << map[a][b] << endl;
}
}