2025.10.10 图论

news/2025/10/11 17:31:30/文章来源:https://www.cnblogs.com/Ydoc770/p/19134597

最短路

P5304 [GXOI/GZOI2019] 旅行者

Hint:考虑从暴力优化. 图论建模,路径最短的两个关键点编号一定不同,按照二进制位划分成两个集合跑最短路.

最暴力的方法我们可以枚举关键点对跑最短路,时间复杂度 \(O(k^2m\log m)\).

显然有很多点对是没有任何意义的,考虑图论建模,一次跑多组最短路. 也就是直接将关键点分为两个集合,建立超级源点 \(S\) 连向其中一个集合的所有点,边权为 \(0\);另一个集合所有点连向超级汇点,边权为 \(0\). 然后跑 \(S\rightarrow T\) 的最短路,当距离最近的两点被分到两个集合时,这样跑就能得到答案. 所以现在的问题就是如何划分关键点.

距离最近的两点编号一定不同,换言之至少有一个二进制位不同. 枚举二进制位,每次将当前二进制位不同的划分成两个集合,跑上面的最短路并更新答案即可. 时间复杂度 \(O(m\log m\log n)\).

P4366 [Code+#4] 最短路

Hint:直接连边边数可以达到 \(O(n^2)\),但是点数是 \(O(n)\),考虑拆位优化建图.

对每个点考虑贡献,发现如果一条新边有若干个二进制位有贡献,那么完全可以拆成若干位贡献再加起来. 也就是说类似于前缀优化建图,我们对于每一个 \(0\le u\le n\) 的点都向改变一位二进制位的点连边,就已经包含了所有可能的新边. 然后跑最短路即可.

P7515 [省选联考 2021 A 卷] 矩阵游戏

Hint:先推出一个不限制值域的答案,然后设出调整的变量,用差分约束求解.

令矩阵 \(A\) 最后一行和最后一列全为 \(0\),可以解出一组符合 \(b_{i,j}\) 限制的解. 现在要尝试修改一个位置上的值,我们需要调整附近位置的值使得仍然满足限制.

进一步观察,发现我们可以对一行或一列进行 \(+x,-x,+x,-x\cdots\) 的操作而仍然满足限制. 设 \(r_i\) 为行上操作的值,\(c_i\) 为列上操作的值,可以列出操作矩阵:

\[\begin{pmatrix} r_1+c_1&-r_1+c_2&r_1+c_3&\cdots\\ r_2-c_1&-r_2-c_2&r_2-c_3&\cdots\\ r_3+c_1&-r_3+c_2&r_3+c_3&\cdots\\ \vdots & \vdots&\vdots&\ddots \\ \end{pmatrix} \]

但是这样的形式分讨稍显复杂,可以考虑对于所有 \(i\) 为偶数的 \(r_i\)\(j\) 为奇数的 \(c_j\) 取相反数. 这仍然是满足限制的.

\[\begin{pmatrix} r_1-c_1&c_2-r_1&r_1-c_3&\cdots\\ c_1-r_2&r_2-c_2&c_3-r_2&\cdots\\ r_3-c_1&c_2-r_3&r_3-c_3&\cdots\\ \vdots & \vdots&\vdots&\ddots \\ \end{pmatrix} \]

现在的形式非常优美了,考虑这个 \(x-y\) 的形式怎么用差分约束. 首先我们求得了一组解 \(a_{i,j}\),所以 \(-a_{i,j}\le x-y\le 10^6-a_{i,j}\),拆成两个不等式分别连边即可.

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long#define gc getwchar_unlocked
#define pc putwchar_unlocked
inline int rd(){int x = 0, f = 1; char ch = gc();while(ch < '0' || ch > '9'){ if(ch == '-') f = -1; ch = gc(); }while(ch >= '0' && ch <= '9'){ x = x * 10 + (ch ^ 48); ch = gc(); }return x * f;
}
inline void wt(int x) {static int stk[40],tp=0;if(x<0) pc('-'),x=-x;do{stk[++tp]=x%10;x/=10;}while(x);while(tp) pc((char)(stk[tp--]+'0'));
}const int maxn = 3e2 + 10, maxnm = 9e4 + 10; const ll inff = 0x3f3f3f3f3f3f3f3f;
int T, n, m, a[maxn][maxn], b[maxn][maxn];
int s = 1;vector<array<int, 2> > e[maxn << 1];
ll dis[maxn << 1]; bool inq[maxn << 1]; int cnt[maxn << 1];
bool spfa() {for(int i = 1; i <= n + m; i++) inq[i] = cnt[i] = 0, dis[i] = inff;deque<int> q; q.push_back(s), inq[s] = true, dis[s] = 0, cnt[s] = 1;while(q.size()) {int u = q.front(); q.pop_front(), inq[u] = false;++cnt[u]; if(cnt[u] > n + m) return false;for(auto [v, w] : e[u]) {if(dis[v] > dis[u] + w) {dis[v] = dis[u] + w;if(!inq[v]) {if(q.size() && dis[v] < dis[q[0]]) q.push_front(v);else q.push_back(v);inq[v] = true;}}}} return true;
}void solve() {for(int i = 1; i <= n + m; i++) vector<array<int, 2> >().swap(e[i]);for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) a[i][j] = 0;n = rd(), m = rd();for(int i = 1; i < n; i++) for(int j = 1; j < m; j++) b[i][j] = rd();for(int i = n - 1; i >= 1; i--) for(int j = m - 1; j >= 1; j--) {a[i][j] = b[i][j] - a[i + 1][j] - a[i][j + 1] - a[i + 1][j + 1];}for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) {int mx = 1e6 - a[i][j], mi = -a[i][j];if((i + j) & 1) e[j + n].push_back({i, -mi}), e[i].push_back({j + n, mx});else e[j + n].push_back({i, mx}), e[i].push_back({j + n, -mi});}if(spfa()) {puts("YES");for(int i = 1; i <= n; i++) {for(int j = 1; j <= m; j++) {if ((i + j) & 1) a[i][j] -= dis[i];else a[i][j] += dis[i];if ((i + j) & 1) a[i][j] += dis[j + n];else a[i][j] -= dis[j + n];wt(a[i][j]); pc(' ');} puts("");}}else puts("NO");return;
}int main() {// ios :: sync_with_stdio(false); cin.tie(0); cout.tie(0);// freopen("P7515_13.in", "r", stdin);// freopen("myout.out", "w", stdout);T = rd(); while(T--) solve();return 0;
}

为啥把链式前向星改成 vector 快了 \(25\) 倍?

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

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

相关文章

xshell把界面转发到xming

linux上执行如下命令 sudo apt install x11-apps -y然后xshell设置会话属性: 断开后重新连接 然后linux执行: xclock & windows上应该会打开一个眼睛的窗口 证明转发成功了作者:xuejianxiyang出处:http://xueji…

使用AI创建angular项目

angular环境已安装,版本信息如下: Angular Cl: 16.2.0 node: 18.10.0 Package Manager: npm 8.19.2 OS:win32 x64 1.使用angular cli创建一个项目 2.设计一个登录界面,包含用户名密码登录进系统,有两个功能菜单, …

大模型在软件研发协同演进

大模型在软件研发协同演进大模型在软件研发领域的应用AI时代软件工程变革与智能化发展趋势智能体能力逐渐成熟人机协同办公场景联动研发工作流,人机交互模式变革研发数字员工研发基础建设案例自动CR测试场景研发场景研…

NocoBase 走进德国大学课堂

将 NocoBase 作为课堂工具,带领学生从零搭建应用,完成低代码/无代码从理论到实践的跨越。原文链接:https://www.nocobase.com/cn/blog/university-course 背景 在德国某科技大学的课程《使用低代码平台进行应用开发…

2025青海视频号运营最新推荐:创意内容与高效推广策略的完美

2025青海视频号运营最新推荐:创意内容与高效推广策略的完美结合随着移动互联网的迅猛发展,短视频平台已经成为企业和个人展示自我、传播信息的重要渠道。在青海地区,视频号作为微信生态中的重要一环,其影响力和用户…

【Kotlin】一种基于链表结构的事件传播机制设计与实现 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

008_函数

1.定义函数 def greet_user(): """显示简单的问候语""" print("Hello!") greet_user() 1.1 向函数传递信息 def greet_user(username): """显示简单的问候语&…

内存分析记录

内存分析记录当碰到 ActivityTaskManager: START u0 {flg=0x10000000 cmp=com.test/com.test.activity.TestActivity} from uid 1000 pid -1 发现pid等于-1,由于是taskview启动,所以需要进一步查找pid信息Line 13009…

详细介绍:构建生产级多模态数据集:视觉与视频模型(参照LLaVA-OneVision-Data和VideoChat2)

详细介绍:构建生产级多模态数据集:视觉与视频模型(参照LLaVA-OneVision-Data和VideoChat2)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !imp…

2025 年图书杀菌机生产厂家最新推荐排行榜:聚焦高效杀菌技术与优质服务,优质企业全面盘点自助图书/臭氧图书/消毒图书/图书杀菌机厂家推荐

随着公共阅读需求的不断增长,图书馆、绘本馆等场所的图书流通频次大幅提升,图书卫生安全问题愈发受到重视。读者在借阅过程中,图书易附着细菌、病毒及灰尘,传统清洁方式难以满足高效杀菌需求,优质图书杀菌机成为必…

公网服务器下的dify安装模型插件的相关问题和操作

公网服务器下的dify安装模型插件的相关问题和操作在前面部署好dify后,我发现安装模型插件出现了一些问题,不知道是有关内存的原因还是什么,在安装模型供应商时非常卡顿。 这是finalshell中的状态,不知道如何解决。…

vscode 生成代码片段

https://snippet-generator.app/

MySQL根据表生成实体类

MySQL根据表生成实体类SELECT CONCAT(/// <summary>\n, ///,column_comment,\n ,/// </summary>, public , ( case LOWER(Data_type) when varchar then string when text then string when tinyint then …

2025票务系统最新推荐榜:高效便捷与用户体验俱佳的优质选择

2025票务系统最新推荐榜:高效便捷与用户体验俱佳的优质选择随着旅游业和娱乐业的快速发展,票务系统的市场需求日益增长。高效的票务系统不仅能够提升用户体验,还能帮助企业提高运营效率。为了帮助筛选票务系统品牌,…

千万公众号运营者必看:8 款编辑器核心能力大 PK

千万公众号运营者必看:8 款编辑器核心能力大 PK一、开篇背景:公众号生态下的创作效率革命 截至2025年,微信公众号数量已突破数千万,编辑器市场规模以年均15%增速扩张至10亿元级别。然而80%的运营者仍受三大痛点困扰…

详细介绍:linux基础服务

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

有度新版本:反向登录、文件路径自定义、有度极速版…管理更自主,切换更顺畅

各位有度用户,大家好! 新版本客户端 (10.0.11) 和服务端 (10.0.0) 已经发布,本次更新带来了反向登录、多语言支持、图片查看器多开等功能,并优化了文件存储与知识库体验,旨在让你在不同场景下的沟通协作更顺畅。一…

C#利用委托实现多个窗体间的传值

原文链接:https://zhuanlan.zhihu.com/p/559679569 要实现这样一个功能:父窗体创建了两个子窗体,子窗体1和子窗体2,1产生的数据要在2中显示出来。 因为这两个子窗体本身之间并没有直接关联,他们都是由父窗体new出…

2025常州微弧氧化批发厂家最新推荐榜:技术领先与优质服务双

2025常州微弧氧化批发厂家最新推荐榜:技术领先与优质服务双随着工业技术的不断进步,微弧氧化技术在金属表面处理领域中扮演着越来越重要的角色。微弧氧化技术通过在金属表面形成一层致密的陶瓷膜,不仅提高了材料的耐…