洛谷 P1119 灾后重建

原题链接:

灾后重建 - 洛谷

题目大意:

有n个村庄,村庄间有m条公路,一次地震将连向每个村庄的公路损坏,所以要进行维修,数据保证编号小的村庄维修时间更少,编号大的村庄维修时间更多。后面有q个询问,问是在第几天的时候从x村庄到y村庄我们是否能到达,如果能到达的最小距离是多少

解题思路:

题目数据给出的是一个稠密图,最大可以是一个全连通图,每两个点之间都有边直连。

最朴素的想法是每读一个查询就对整个新图重新跑一次dijkstra,复杂为O(Q*m*n*logn)=O(Q*n^3*logn),如果换成floyd,复杂度为O(Q*n^3),更好,但依然超时。

其实我们可以只需要完整的进行一次floyd,而不需要Q次,总的复杂度为O(Q+n^3)。

因为每个顶点的修复时间是按顶点编号递增的,floyd的执行过程又是逐步加入点,从第1个点扩展到第n个点,加第k个点时,前面的1~k-1个点都已经执行完毕,当k到达最后的第n个点时,包含所有1~n点的最短路径计算完毕。而在本题,在第t个时刻,小于t时刻的图的顶点的最短路径计算完毕,在t+1时刻,只需要在t时刻计算结果的基础上,继续计算新加入的点(t~t+1时间内修复的村庄)即可。

代码(CPP):

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 310;
const int INF = 0x3fffffff;
const int mod = 1000000007;
struct edge {int v, w;
};
int dis[maxn][maxn];
int t[maxn];
int n, m;/*题目数据给出的是一个稠密图,最大可以是一个全连通图,每两个点之间都有边直连。最朴素的想法是每读一个查询就对整个新图重新跑一次dijkstra,复杂度为O(Q*m*n*logn)=O(Q*n^3*logn),如果换成floyd,复杂度为O(Q*n^3),更好,但依然超时。其实我们可以只需要完整的进行一次floyd,而不需要Q次,总的复杂度为O(Q+n^3)。因为每个顶点的修复时间是按顶点编号递增的,floyd的执行过程又是逐步加入点,从第1个点扩展到第n个点,加第k个点时,前面的1~k-1个点都已经执行完毕,当k到达最后的第n个点时,包含所有1~n点的最短路径计算完毕。而在本题,在第t个时刻,小于t时刻的图的顶点的最短路径计算完毕,在t+1时刻,只需要在t时刻计算结果的基础上,继续计算新加入的点(t~t+1时间内修复的村庄)即可。
*/void solve() {cin >> n >> m;for (int i = 0; i < n; i++) {cin >> t[i];}for (int i = 0; i < n; i++){for (int j = 0; j < n; j++) {if (i != j)dis[i][j] = dis[j][i] = INF;}}while (m--) {int u, v, w;cin >> u >> v >> w;dis[u][v] = dis[v][u] = w;}int q;cin >> q;int k = 0;while (q--) {int u, v, tt;cin >> u >> v >> tt;for (; k < n && t[k] <= tt; k++) {  // 将t~t+1时刻内修复的点的计算出来for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (dis[i][k] != INF && dis[k][j] != INF && dis[i][k] + dis[k][j] < dis[i][j]) {dis[i][j] = dis[i][k] + dis[k][j];}}}}if (dis[u][v] == INF || t[u] > tt || t[v] > tt) {cout << -1 << endl;} else {cout << dis[u][v] << endl;}}
}int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cout << fixed;cout.precision(18);solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/20729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

固定资产管理软件

固定资产全生命周期管理软件采用先进的RFID技术&#xff0c;从采购、入库、借用、总结、清理到损坏等方面准确统计资产&#xff0c;突破过去手工统计的复杂性&#xff0c;节省资产资源&#xff0c;减少调查时间&#xff0c;确保资产管理工作的准确性和快速性。 固定资产管理软…

MySQL概述与体系结构

文章目录 一、MySQL概述1.1 MySQL与redis的区别1.2 数据处理分类1.3 SQL1.4 数据类型 二、数据库设计三范式2.1 范式一2.2 范式二2.3 范式三2.4 反范式 三、MySQL体系结构3.1 结构组成3.2 连接池 四、sql语句执行过程4.1 select语句4.2 CRUD执行过程 一、MySQL概述 1.1 MySQL与…

(YouTube)KDBA QML 学习笔记1

&#xff08;YouTube&#xff09;KDBA QML 学习笔记 旧版本(QML文件介绍) main.qml import QtQuick 2.0Text {text: "Hell World" }main.cpp #include <QtQuick>int mian(int argc, char *argn[]) {QGuiApplication app(argc, argv);//QT开始 QQuickvi…

【力扣】 12. 整数转罗马数字 模拟

力扣 12. 整数转罗马数字 解题思路 当某个位数的某个数不为4或9时&#xff0c;高位对应的字符总是在低位对应的字符前面。只有当该数为4或9时&#xff0c;低位对应的字符在高位前面。 根据这一特性&#xff0c;我们进行分类讨论。 1.当数为4时&#xff0c;则对应的罗马数为 10 …

一文带你了解TCP/IP模型以及封装和分用

文章目录 1. 网络协议2. OSI七层网络模型3.TCP/IP (五层/四层)4. 封装和分用 1. 网络协议 网络协议是计算机网络中用于规定数据在网络中传输和处理的规则&#xff0c;它定义了在网络中通信的格式、规范和顺序。网络协议可以分为不同的层次&#xff0c;每个层次负责不同的功能和…

Python模块psycopg2连接postgresql

目录 1. 基础语法 2. 基础用法 3. 多条SQL 4. 事务SQL 1. 基础语法 语法 psycopg2.connect(dsn #指定连接参数。可以使用参数形式或 DSN 形式指定。host #指定连接数据库的主机名。dbname #指定数据库名。user #指定连接数据库使用的用户名。…

Matlab实现Kmeans++算法(每行代码标注详细注解)

逐行代码讲解Kmeans算法的原理及其实现&#xff0c;后续将更新该算法的进一步优化的代码的讲解 目录 一、什么是Kmeans算法 二、Kmeans算法原理 三、Kmeans算法代码解析 四、总结 一、什么是Kmeans算法 K-means算法的优点是简单易实现&#xff0c;计算效率高&#xff0c;适…

寄存器详解(一)

目录 前言&#xff1a; 通用寄存器 示例&#xff1a; 通用寄存器的划分 汇编指令 cpu物理地址的形成 地址加法器运算示例&#xff1a; 1. 相关部件提供段地址和偏移地址 2. 段地址和偏移地址送入地址加法器 3. 段地址*16 4. 求出物理地址 5. 输出物理地址 段的概念 Deb…

[C++项目] Boost文档 站内搜索引擎(3): 建立文档及其关键字的正排 倒排索引、jieba库的安装与使用...

之前的两篇文章: 第一篇文章介绍了本项目的背景, 获取了Boost库文档 &#x1fae6;[C项目] Boost文档 站内搜索引擎(1): 项目背景介绍、相关技术栈、相关概念介绍…第二篇文章 分析实现了parser模块. 此模块的作用是 对所有文档html文件, 进行清理并汇总 &#x1fae6;[C项目] …

309. 买卖股票的最佳时机含冷冻期

给定一个整数数组prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;: 卖出股票后&#xff0c;你无法在第二天买入股票 …

牛客网Verilog刷题——VL56

牛客网Verilog刷题——VL56 题目答案 题目 实现4bit无符号数流水线乘法器设计。电路的接口如下图所示&#xff1a; 输入输出描述&#xff1a; 信号类型输入/输出位宽描述clkwireInput1系统时钟信号rst_nwireInput1异步复位信号&#xff0c;低电平有效mul_awireInputsize乘数mu…

Selenium Chrome Webdriver 如何获取 Youtube 悬停文本

导语 Youtube 是一个非常流行的视频分享平台&#xff0c;有时候我们可能想要爬取一些视频的信息&#xff0c;比如标题、播放量、点赞数等。但是有些信息并不是直接显示在网页上的&#xff0c;而是需要我们将鼠标悬停在某个元素上才能看到&#xff0c;比如视频的时长、上传时间…

自动化测试学习方向

1. 首先要搞明白几个问题 本来想写一些东西&#xff0c;但忽然发现虫师已经对这个问题总结很到位了&#xff0c;所以我也就不想多说什么&#xff0c;放上链接&#xff0c;学自动化测试之前&#xff0c;先去看看吧 在做自动化测试之前你需要知道的 2. 语言基础 很多想学自动化…

NGZORRO:动态表单/模型驱动 的相关问题

官网的demo的[nzFor]"control.controlInstance"&#xff0c;似乎是靠[formControlName]"control.controlInstance"来关联的。 <form nz-form [formGroup]"validateForm" (ngSubmit)"submitForm()"><nz-form-item *ngFor&quo…

ThinkPHP v6.0.8 CacheStore 反序列化漏洞

漏洞说明 1. 漏洞原理&#xff1a;ThinkPHP 6.0.8 CacheStore 会触发POP利用链子&#xff0c;造成任意命令执行 2. 组件描述&#xff1a; ThinkPHP是一个免费开源的&#xff0c;快速、简单的面向对象的轻量级PHP开发框架 3. 影响版本&#xff1a;V6.0.8 漏洞复现 1. 环境安…

Docker实践:使用Docker搭建个人开发环境(极简版)

文章目录 说明教程1. 编写 Dockerfile2. 编写 docker-compose.yml3. 使用容器创建容器启动容器进入容器命令行VSCode 4. 关闭容器5. 备份容器导出导入 6. 重置容器 相关资料文章合集详细了解本文在个人电脑上安装 Docker容器使用 NVIDIA 显卡托管镜像运行GUI程序 说明 本文是在…

git删除已经提交的大文件

当你不小心把一个巨大的二进制文件提交到git仓库的时候&#xff0c;此时删除再提交也没有用了&#xff0c;大文件已经在仓库中留底了。另外比如需要删除某个需要保密的文件&#xff0c;都是相同的解决办法。 我本来想着把dll放在三方库里面提交到仓库里&#xff0c;省得在不同…

3.playbook剧本二

文章目录 playbook二Roles模块roles模式安装LNMP创建nginxfiles目录handlers目录tasks目录templates目录vars目录 创建mysqltasks目录 创建phpfiles目录handlers目录tasks目录templates目录vars目录 创建LNMP剧本文件 playbook二 Roles模块 角色的作用&#xff1a;把playbook…

安全渗透知识总结二

目录 一、html实体编码 1、Unicode字符编码 2、字符的数字表示 3、常见实体编码 4、url 协议 主机 http状态码 http常用的状态码 端口 常见协议端口 查询参数 锚点 url字符 urlcode字符 绝对url和相对url 二、字符编码 Ascll字符集 html字符集 html的url编码 …

【剑指Offer 05】 替换空格,Java解密。

LeetCode 剑指Offer 75道练习题 文章目录 剑指Offer:替换空格题目:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例:限制:解题思路:剑指Offer:替换空格 题目:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 示例: 输入:s =…