Contest5400 - 网络流-1

news/2025/1/15 21:04:45/文章来源:https://www.cnblogs.com/AugustLight/p/18341321

Contest

A 签到题

B 最大流

Dinic 板子。

Dinic 的整体结构:

ll dinic() {ll ans = 0;while (bfs()) { // 如果 s 还有能到 t 的增广路fill(cur+1, cur+n+1, 0); // 当前弧优化的预处理,暂时不用管ans += dfs(s, INF); // 多路增广}return ans;
}

BFS 建分层图:

bool bfs() {fill(level+1, level+n+1, 0); // 清空上一次的分层queue<int> q;level[s] = 1, q.push(s);while (!q.empty()) {int u = q.front(); q.pop();for (auto [v, i] : G[u]) {if (!level[v] /*没 BFS 到过*/ && c[i] > f[i] /*还有残量*/) {level[v] = level[u] + 1; // 把 v 扔到 u 的下一层q.push(v);}}}return level[t] != 0; // 能从 s 到 t
}

DFS 多路增广:

ll dfs(int u, ll flow) {if (u == t)return flow;ll tmp = flow; // 当前还有多少流能用for (int &idx = cur[u]; idx < int(G[u].size()); idx++) { // 当前弧优化,之前走过的不要再走auto [v, i] = G[u][idx];if (level[v] != level[u] + 1) // 在分层图上不是下一层就别去continue;ll t = dfs(v, min(tmp, c[i] - f[i])); // min(能用的流, 这条边的残量)f[i] += t;f[i ^ 1] -= t;tmp -= t;if (tmp == 0) // 没流了break;}return flow - tmp; // 总共用了多少流
}

完整代码:

#include <bits/stdc++.h>
#define rep(i, l, r) for (int i = (l); i <= (r); i++)
#define per(i, r, l) for (int i = (r); i >= (l); i--)
using namespace std;
typedef long long ll;const int MAXN = 200 + 5;
const int MAXM = 5e3 + 5;
const ll INF = 1e12;int n, m, s, t;
vector<pair<int, int>> G[MAXN];
ll c[MAXM * 2], f[MAXM * 2];
int level[MAXN], cur[MAXN];bool bfs() {fill(level+1, level+n+1, 0);queue<int> q;level[s] = 1, q.push(s);while (!q.empty()) {int u = q.front(); q.pop();for (auto [v, i] : G[u]) {if (!level[v] && c[i] > f[i]) {level[v] = level[u] + 1;q.push(v);}}}return level[t] != 0;
}
ll dfs(int u, ll flow) {if (u == t)return flow;ll tmp = flow;for (int &idx = cur[u]; idx < int(G[u].size()); idx++) {auto [v, i] = G[u][idx];if (level[v] != level[u] + 1)continue;ll t = dfs(v, min(tmp, c[i] - f[i]));f[i] += t;f[i ^ 1] -= t;tmp -= t;if (tmp == 0)break;}return flow - tmp;
}
ll dinic() {ll ans = 0;while (bfs()) {fill(cur+1, cur+n+1, 0);ans += dfs(s, INF);}return ans;
}int main() { ios::sync_with_stdio(0); cin.tie(0);cin >> n >> m >> s >> t;rep(i, 1, m) {int u, v, w; cin >> u >> v >> w;G[u].emplace_back(v, i << 1), c[i << 1] = w;G[v].emplace_back(u, i << 1 | 1);}cout << dinic() << '\n';return 0;
}

C 防鼠工程

洛谷原题 P4001 [ICPC-Beijing 2006] 狼抓兔子。

简要题意:给定一张如下的 \(n \times m\) 的网格图,求其最小割。\(n,m \le 10^3\),保证输入文件的大小在 10M 以内。

Sol 1: 最小割 = 最大流

根据最大流最小割定理,最小割等于最大流,Dinic 硬跑最大流即可。

时间复杂度为玄学,虽然点边都到 \(10^6\) 级别,但是可能是因为图的特殊性质它 2s 跑过去了。

long long 会被卡空间,开 int 能过。

Sol 2: 平面图最小割 = 对偶图最短路

考虑把整张图割开就是要从左下角的空白区域找一条路一直割到右上角的空白区域,我们建出对偶图跑最短路 Dijkstra 即可。说不定 SPFA 也能过,毕竟特殊图

这次时间复杂度不是玄学,是 \(O(n^2 \log n)\)

D 坐座位

简要题意:给定一张稠密的二分图,求其最大匹配。设左部点数量为 \(n_1\),右部点数量为 \(n_2\)\(n_1,n_2 \le 200\)

匈牙利算法板子

建模:令 \(s = n_1 + n_2 + 1, t = n_1 + n_2 + 2\)。原图的每条边 \(u \rightarrow v\) 边权设为 \(1\),给所有左部点 \(u\) 连边 \(s \rightarrow u\) 边权为 \(1\),给所有右部点 \(v\) 连边 \(v \rightarrow t\),跑 Dinic 即可。

值得注意的是,Dinic 跑二分图的时间复杂度为 \(O(\sqrt n m)\),不是玄学。

坑点:

  • 右部点的编号要加上 \(n_1\)
  • MAXN 要开到 \(n_1 + n_2\),也就是两倍 \(n_1\)
  • MAXM 要开到 \(m + n_1 + n_2\)(不算反向边)
  • \(n\) 要开到 \(n_1 + n_2 + 2\),也就是 \(t\)

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

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

相关文章

MySQL45讲基础篇

基础篇 01 | 基础架构:一条SQL查询语句是如何执行的? 你好,我是林晓斌。 这是专栏的第一篇文章,我想来跟你聊聊 MySQL的基础架构。我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于MySQL的学习也是这样。平…

Datawhale AI 暑期夏令营 第四期Task3

Transformer架构 Transformer是一种用于自然语言处理(NLP)和其他序列到序列(sequence-to-sequence)任务的深度学习模型架构,它在2017年由Vaswani等人首次提出。Transformer架构引入了自注意力机制(self-attention mechanism),这是一个关键的创新,使其在处理序列数据时…

基于IEEE802.11g标准的OFDM信号帧检测matlab仿真

1.程序功能描述现有的无线通信信道共享的无线信号识别为将来的软件定义的无线电系统是一个巨大的挑战。在这个项目中,学生将制定IEEE802.11无线信号在AWGN信道,利用MATLAB/ Simulink技术来识别。一个完整的发射机模式将开发和实施。 在AWGN信道下的性能进行评估。基于IEEE802…

羽毛球比赛积分系统03

羽毛球比赛积分系统 1、产品愿景目标用户 学校的体育工作人员(老师、教练、裁判),学生和教师选手,赛事组织者,志愿者等羽毛球比赛的参与者。他们的需要或机会简化赛事安排和管理。 提高比赛的公正性和透明度。 实时掌握比赛成绩和排名。 增强赛事互动和参与体验。产品名称…

实现一个终端文本编辑器来学习golang语言:第二章Raw模式下的输入输出

从第二章开始,在每个小节的最后都会有一些代码实操作业,你可以选择自己完成(比较推荐),再对照我的实现方式,当然也可以直接看我的代码实现。不过,之后的各个功能实现,我都会基于我先前的代码实现版本,在它的基础上进行扩展。 首先,我们先来解决第一章遗留的第一个问题…

protobuf pwn题专项

protobuf pwn 准备工作 安装protobuf编译器 sudo apt-get install libprotobuf-dev protobuf-compiler 安装python依赖库 pip3 install grpcio pip3 install grpcio-tools googleapis-common-protos安装pbtk git clone https://github.com/marin-m/pbtkggbond 来自DubheCTF202…

JAVA游戏源码:魔塔大学生练手项目java学习项目

学习java朋友们,福利来了,今天小编给大家带来了一款魔塔源码。注意:此源码仅供学习使用!! 视频演示 源码搭建和讲解 启动main入口://************************************************************************ // ************完整源码移步: gitee典康姆/hadluo/java_g…

第五周进度报告

这周主要学习了java的一些基础知识,接下来的任务继续学习javaAPI部分的知识 鼠标监听机制 - MouseListener键盘监听机制 -KeyListener常用APIpackage me.Study;public class Test {public static void main(String[] args) {//获取到当前时间的毫秒值long start = System.curre…

dotnet hello world

参考资料 dotnet 命令参考 使用 dotnet test 和 xUnit 在 .NET 中对 C# 进行单元测试 Declaring InternalsVisibleTo in the csproj XUnit输出消息 创建控制台项目 # 创建项目目录 md DotnetStudy cd DotnetStudy# 创建解决方案 dotnet new sln # 创建控制台项目,-n: 名称,--us…

第五周学习mysql

本周学完了mysql基础部分的知识点 下周将学习进阶方面 本周浮躁了很多,目标都没定好,发现学这些mysql和之前学的代码思路有很多不一样的地方,上手很慢,学完事务之后才有一些整体的意思; 下周会定好目标加油努力学到视图,如果是只看视频不跟着敲代码的话,那就学完进阶篇,…