1505.用弗洛伊德算法求赋权图的两点间的最短路径的长度

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;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值