P11915 [PA 2025] Teleport 题解

news/2025/3/28 11:21:23/文章来源:https://www.cnblogs.com/Scarab/p/18793444

Description

给定一张 \(n\) 个节点的简单无向连通图,边权全为 \(1\)

在图中加入一条边权为 \(0\) 的边,最小化加边后这张图的 \(\displaystyle \max_{1\le u,v\le n} \{\operatorname{dist}(u,v)\}\)。只需要求出 \(\displaystyle \max_{1\le u,v\le n} \{\operatorname{dist}(u,v)\}\) 的最小值。

这里,\(\operatorname{dist}(u,v)\) 定义为 \(u,v\) 间最短路长度。

\(n\leq 400\)

Solution

首先有个观察是对于如果 \(\text{dist}(i,x)\leq\text{dist}(i,y)\),那么走 \(i\to y\to x\to j\) 一定没有意义,因为走后面的要么没有 \(x\to y\) 优要么不如直接不经过 \((x,y)\)

考虑怎么判断 \(ans\) 是否合法。

枚举 \(i\),对于所有 \(\text{dist}(i,j)>ans\)\((i,j)\),如果满足 \(\text{dist}(i,x)\leq\text{dist}(i,y)\)\(\text{dist}(i,x)+\text{dist}(y,j)>ans\)\((x,y)\) 不合法。

但是这么做单次是 \(O(n^4)\) 的。

考虑对于 \(y\) 维护 \(mx_{i,y}\) 表示所有必须经过新加入边的 \((i,j)\)\(\text{dist}(y,j)\) 的最大值。那么一对 \((x,y)\)\(i\) 处不合法就等价于 \(\text{dist}(i,x)+mx_{i,y}>ans\)

时间复杂度:\(O(n^3\log n)\)

还是过不了。


注意到我们只需要判断是否存在一组边满足条件,所以考虑从大到小枚举 \(ans\),每次同样枚举 \(i\),并对于每个 \(y\) 维护 \(pos_{i,y}\) 表示目前 \(\text{dist}(i,x)\leq\text{dist}(i,y)\)\((x,y)\) 还没被删的 \(\text{dist}(i,x)\) 最大的 \(x\)

加入新边后暴力枚举 \(y\) 更新 \(pos\) 即可。

时间复杂度:\(O(n^3)\)

Code

#include <bits/stdc++.h>// #define int int64_tconst int kMaxN = 405;int n, tot;
int dis[kMaxN][kMaxN], pos[kMaxN], pp[kMaxN][kMaxN], mx[kMaxN][kMaxN], id[kMaxN][kMaxN];
bool res[kMaxN][kMaxN];void del(int x, int y) {tot -= res[x][y], res[x][y] = res[y][x] = 0;
}bool work(int ans) {for (int i = 1; i <= n; ++i) {for (; pos[i] && dis[i][id[i][pos[i]]] > ans; --pos[i]) {int x = id[i][pos[i]];for (int j = 1; j <= n; ++j)mx[i][j] = std::max(mx[i][j], dis[x][j]);}for (int j = 1; j <= n; ++j) {for (; pp[i][j]; --pp[i][j]) {int x = id[i][pp[i][j]];if (!res[x][j]) continue;if (dis[i][x] + mx[i][j] <= ans) break;del(j, x);}// for (int k = 1; k <= n; ++k)//   if (dis[i][k] >= dis[i][j] && dis[i][j] + mx[i][k] > ans)//     del(j, k);}}// std::cerr << tot << '\n';// if (tot == 2) {//   for (int i = 1; i <= n; ++i)//     for (int j = 1; j <= n; ++j)//       if (res[i][j])//         std::cerr << i << ' ' << j << '\n';// }return tot != 0;
}void dickdreamer() {std::cin >> n;for (int i = 1; i <= n; ++i)std::fill_n(dis[i] + 1, n, 1e9), dis[i][i] = 0;for (int i = 1; i <= n; ++i) {std::string s;std::cin >> s;for (int j = 1; j <= n; ++j)if (s[j - 1] == '1')dis[i][j] = 1;}for (int k = 1; k <= n; ++k)for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)dis[i][j] = std::min(dis[i][j], dis[i][k] + dis[k][j]);for (int i = 1; i <= n; ++i) {for (int j = 1; j <= n; ++j) id[i][j] = j;std::sort(id[i] + 1, id[i] + 1 + n, [&] (int x, int y) { return dis[i][x] < dis[i][y]; });for (int j = 1; j <= n; ++j) pp[i][id[i][j]] = j - 1;pos[i] = n;std::fill_n(mx[i] + 1, n, -1e9);for (int j = i + 1; j <= n; ++j)res[i][j] = res[j][i] = 1;}tot = n * (n - 1) / 2;for (int i = n; i; --i) {if (!work(i)) return void(std::cout << i + 1 << '\n');}std::cout << "1\n";
}int32_t main() {
#ifdef ORZXKRfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);
#endifstd::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);int T = 1;std::cin >> T;while (T--) dickdreamer();// std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";return 0;
}

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

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

相关文章

接口测试——requests库(python+requests)(框架2)

一、unittest框架 1、运行所有接口用例 unittest.main() import unittest import requests from time import * from uizdh.HTMLTestRunnerNew import HTMLTestRunner class cms(unittest.TestCase):@classmethoddef setUpClass(cls) -> None:cls.s=requests.Session()@clas…

接口测试——requests库(python+requests)(2)

一、unittest框架 1、运行所有接口用例 unittest.main() import unittest import requests from time import * from uizdh.HTMLTestRunnerNew import HTMLTestRunner class cms(unittest.TestCase):@classmethoddef setUpClass(cls) -> None:cls.s=requests.Session()@clas…

vxe-table 给单元格添加自定义颜色状态,单元格加自定义样式

vxe-table 给单元格添加自定义颜色状态,单元格加自定义样式 查看官网:https://vxetable.cn gitbub:https://github.com/x-extends/vxe-table gitee:https://gitee.com/x-extends/vxe-table 第一种, class 方式 通过 headerCellClassName 、rowClassName 、cellClassName …

20242924 2024-2025-2 《网络攻防实践》实践四报告

20242924 2024-2025-2 《网络攻防实践》实践4报告 1.实践内容 在网络攻防实验环境中完成TCP/IP协议栈重点协议的攻击实验,包括ARP缓存欺骗攻击、ICMP重定向攻击、SYN Flood攻击、TCP RST攻击、TCP会话劫持攻击。 1.1 ARP缓存欺骗攻击 ARP(Address Resolution Protocol):即地…

TCPing:用于测试禁ping设备的 TCP 连接的可达性

场景: 当设备被禁止 icmp 协议通过时,可以使用 tcp 来测试网络的连通性以及延迟TCPing tcping 是一个类似于ping 的工具,但它用于测试 TCP 连接的可达性,而不仅仅是 ICMP(传统的 ping)连接。它通过尝试与远程主机上的指定端口建立 TCP 连接,来判断目标主机的端口是否开放…

Go打包dll

1. goland 编写 代码package main/* #include <stdlib.h> */ import "C"//export Add func Add(a, b int) int {return a + b }//export Greet func Greet(v *C.char) *C.char {name := C.GoString(v)return C.CString("Hello from !" + name) } //e…

SpringSecurity5(11-跨域配置)

Spring Security跨域配置通过在WebSecurityConfigurerAdapter中自定义CorsConfiguration实现。可以配置允许的请求来源、请求方法、请求头等,以确保前端与后端之间的安全通信。结合@CrossOrigin注解或CorsFilter进行灵活配置,保障不同源的资源访问权限控制和数据安全。Spring…

AI大模型危机-多维对抗时代的网络安全与隐私困局

文章学习笔记:AI大模型危机-多维对抗时代的网络安全与隐私困局AI发展引发的安全风险与日俱增,加剧了网络安全形式的复杂性。本文剖析了大模型全生命周期安全威胁图谱,揭示数据资源枯竭、隐私泄露、监管滞后等风险问题。 AI大模型驱动网络安全风险”多维裂变“ AI大模型的发展…

CB2401是一款高性能、低功耗可完美替代RFX2401C/AT2401C

CB2401是一款高性能、低功耗的2.4GHz射频前端集成电路(RFIC),专为蓝牙、Zigbee和2.4GHz专有协议无线应用设计。该芯片可完美替代RFX2401C和AT2401C,提供更优的性能和更低的功耗。 主要技术参数核心优势 更高发射功率:+22dBm输出功率,比竞品高出2dB,通信距离更远 更低功耗:…

CH341 Linux驱动 设备驱动连接后又自动关闭

1.uname -r 查看linux版本号2.选择合适内核下的驱动 https://elixir.bootlin.com/linux/v6.8/source/drivers/usb/serial/ch341.c 3.make & make install 4.发现/dev下没有ttyUSB0设备 5.dmesg 发现问题 6043.015612] usb 1-4.2: ch341-uart converter now attached to tty…

会计学-现金流表(三)

介绍 什么是现金流量表?:就是反映你当前现金状况的一个表。 由四个部分构成:期初现金 + 本期流入现金 - 本期流出现金 = 期末现金一个企业或者一个家庭很多时候,即使是落入资不抵债的局面,也未必就会陷入破产,只要他的现金流可以一直维持日常运转,就可以不需要被迫去变卖…