算法题(254):灾后重建

审题:
本题需要我们在有时间作为限定条件的情况下,找到特定时间时任意两点之间的最短路径

思路:

方法一:floyd算法

题目中会给定n个村庄(节点)的重建完成时间以及各个村庄之间的路径权值,然后进行k次询问,查询某个时间点的两个村庄的最短路径

注意:只有重建完成的村庄相关路径可走,在重建时间当天就可通路,节点重建时间递增,查询时间节点递增

输入样例解析:

第一轮询问:day2,求节点2与节点0之间的最短路径

此时只有0节点和1节点重建完成,将节点0和1纳入floyd算法的考虑,所以不存在最短路径,返回-1

第二轮询问:day2,求节点0与节点1之间的最短路径

由于0和1之间没有路径,所以不存在最短路径,返回-1

第三轮询问:day3,求节点0与节点1之间的最短路径

节点2加入floyd算法考虑,此时存在一条路径(0->2->1),长度为5

第四轮询问:day4,求节点0与节点1之间的最短路径

节点3加入floyd算法考虑,此时存在更短的路径(0->2->3->1),长度为4

综上,由于查询的t是逐渐递增,而我们的floyd算法的核心就是逐渐增加要考虑的点,所以我们的查询过程和floyd算法的计算过程是同步的, 只要根据给定查询天数进行指定次的floyd算法即可(相当于把第一层for循环给分解成n次调用floyd函数)

解题:

cpp 复制代码
#include<iostream>
#include<cstring>
using namespace std;
const int N = 210, INF = 0x3f3f3f3f;
int n, m;
int t[N];
int f[N][N];//索引从0开始
void floyd(int k)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			f[i][j] = min(f[i][j], (f[i][k] + f[k][j]));
		}
	}
}
int main()
{
	//数据录入
	cin >> n >> m;
	for (int i = 0; i < n; i++) cin >> t[i];
	//初始化f
	memset(f, 0x3f, sizeof f);
	for (int i = 0; i < n; i++)
	{
		f[i][i] = 0;
	}
	for (int i = 1; i <= m; i++)
	{
		int l, r, v; cin >> l >> r >> v;
		f[l][r] = f[r][l] = v;
	}
	int cnt = 0, pos = 0;
	cin >> cnt;
	while (cnt--)
	{
		int l, r, v; cin >> l >> r >> v;
		//进行分批的floyd
		while (pos < n && t[pos] <= v)
		{
			floyd(pos++);
		}
		//答案输出
		if (t[l] > v || t[r] > v || f[l][r] == INF) cout << -1 << endl;
		else cout << f[l][r] << endl;
	}
	return 0;
}

关键1:节点的下标是从0开始的

注意记录节点信息的时候从0开始

关键2:没有重边

没有重边,我们就可以直接传递边权值,而不用min

关键3:答案输出

若当前时间段,两个端点村庄存在没有重建完成的,直接输出-1,若路径不存在也是同理

否则就可以输出结果

P1119 灾后重建 - 洛谷

相关推荐
青山木13 小时前
Hot 100 ---腐烂的橘子
java·数据结构·后端·算法·leetcode·广度优先
未来之窗软件服务13 小时前
计算机考试-快速排序—东方仙盟
数据结构·算法·排序算法·仙盟创梦ide·东方仙盟
小龙报13 小时前
【优选算法】1. 水果成蓝 2.找到字符串中所有字母的异位词
java·c语言·数据结构·数据库·c++·redis·算法
txzrxz14 小时前
数论:排列数、组合数、费马小定理、逆元、同余定理
c++·算法·数论·组合数·费马小定理·逆元·排列数
xqqxqxxq14 小时前
LeetCode Hot100 双指针专项题解笔记
笔记·算法·leetcode
闪电悠米15 小时前
力扣hot100-54.螺旋矩阵-模拟边界控制详解
算法·leetcode·矩阵
变量未定义~15 小时前
虚拟节点-星石传送阵(4星)、强连通分量
数据结构·算法
IT方大同15 小时前
C语言分支与循环语句
c语言·开发语言·算法
思-无-涯16 小时前
测试面试新趋势:工程思维成关键
人工智能·功能测试·测试工具·职场和发展·可用性测试
待磨的钝刨16 小时前
深入理解主成分分析(PCA)
人工智能·线性代数·算法·机器学习