网络流算法及例题

server/2025/2/9 1:01:20/

题单

来源:https://www.cnblogs.com/ticmis/p/13211073.html

编号题目名字题目模型转化模型完成情况
1飞行员配对方案问题二分图最大匹配二分图
2孤岛营救问题分层图最短路径最短路径
3汽车加油行驶问题分层图最短路径最短路径
4软件补丁问题最小转移代价最短路径
5星际转移问题分层图转移最大流
6太空飞行计划问题最大权闭合图最小割
7最小路径覆盖问题有向无环图最小路径覆盖最大流
8魔术球问题有向无环图最小路径覆盖最大流
9圆桌问题二分图多重匹配最大流
10试题库问题二分图多重匹配最大流
11分配问题二分图最佳匹配费用流
12方格取数问题二分图点权最大独立集最小割
13骑士共存问题二分图点权最大独立集最小割
14负载平衡问题费用流水题模板题费用流
15运输问题费用流水题模板题费用流
16最长递增子序列问题限制性带权路径最大流
17航空路线问题限制性带权路径费用流
18数字梯形问题限制性带权路径费用流
19最长k可重区间集问题限制性带权路径费用流
20最长k可重线段集问题限制性带权路径费用流
21深海机器人问题限制性带权路径费用流
22火星探险问题限制性带权路径费用流
23餐巾计划问题线性规划网络流优化费用流

最短路模型

「网络流 24 题」孤岛营救 *

「网络流 24 题」软件补丁 *

均可直接「状压」跑最短路。

「网络流 24 题」汽车加油行驶问题 *

分层图最短路。

最大流模型

const int N=1e6+5,M=2e6+5;
int head[N],dis[N],cur[N],ver[M],edge[M],nxt[M],tot=1,S,T;
void init(){for (int i=0;i<=tot;i++) ver[i]=edge[i]=nxt[i]=0;tot=1;for (int i=1;i<=T;i++) head[i]=0;
}
void add(int u,int v,int w){ver[++tot]=v,edge[tot]=w;nxt[tot]=head[u],head[u]=tot;
}
void append(int u,int v,int w){add(u,v,w);add(v,u,0);
}
bool bfs(){for (int i=1;i<=T;i++) dis[i]=0,cur[i]=head[i];queue<int> q;q.push(S),dis[S]=1;while (!q.empty()){int u=q.front(); q.pop();for (int i=head[u];i;i=nxt[i]){int v=ver[i],w=edge[i];if (w&&!dis[v]){dis[v]=dis[u]+1;if (v==T) return 1;q.push(v);}}}return 0;
}
int dfs(int u,int flow){if (u==T) return flow;int sum=0;for (int i=cur[u];i;cur[u]=i=nxt[i]){int v=ver[i],w=edge[i];if (w&&dis[v]==dis[u]+1){int f=dfs(v,min(w,flow));edge[i]-=f,edge[i^1]+=f;sum+=f,flow-=f;if (!flow) break;}}if (!sum) dis[u]=0;return sum;
}
int Max_flow(){int res=0;while (bfs()) res+=dfs(S,1e9);return res;
}

类二分图

  • 特点:用于处理 n n n 场比赛 m m m 个人、 n n n 种类型 m m m 个元素等含有 2 2 2 种相关元素的题目。
  • 技巧:可以建立二分图,并通过超级汇点、超级源点来进行网络流。
  • 模型转化:DAG 最小路径覆盖

「网络流 24 题」搭配飞行员 *

二分图。

「网络流 24 题」试题库 *

建出 n + k n+k n+k 个点的类二分图即可。

「网络流 24 题」圆桌聚餐 *

m m m 个点代表不同单位, n n n 个点代表餐桌,类二分图。

洛谷 P3425 [POI 2005] KOS-Dicing

「最大值最小」用二分。

建出 n + m n+m n+m 个点,其中源点向每个比赛连 1 1 1 的边,每个比赛分别向对应的 2 2 2 人连 1 1 1 的边,每个人向汇点连 Mid \text{Mid} Mid 的边。

「网络流 24 题」最小路径覆盖

「网络流 24 题」魔术球 *

最小路径数 = = = 总点数 − - 被覆盖边数

把每个点拆为入点和出点,若在原图存在 u → v u\to v uv,则在新图上从 u u u 的出点连向 v v v 的入点,并将 S S S 连向所有出点,所有入点连向 T T T

最小割

  • 特点:取了某些元素,则另一些元素就不能取,使得价值最值化;且可以将元素划分为 2 2 2 个集合,使得在每个集合内取任意元素都合法。
  • 技巧:建立二分图连接集合 U U U V V V,并在 U → V U\to V UV 连接 + ∞ +\infin + 的边, S → U S\to U SU 设为 U U U 中元素的权值, V → T V\to T VT 设为 V V V 中元素的权值,即可跑最小割(最大流)。
  • 模型转化:网格图相邻操作 / 最大权闭合子图(每个点有代价,选择其中一些点,若某个集合内所有点都被选择会有一个收益,求净利润最大值)

「网络流 24 题」方格取数

「网络流 24 题」骑士共存 *

将格子黑白染色,即可分为 2 2 2 个集合。根据上述方式建图跑最大流即可。

「网络流 24 题」太空飞行计划

洛谷 P4174 [NOI2006] 最大获利 *

实验与仪器分为两个集合,求出的最小割即为「不选择的实验的价值和 + + + 选择的仪器的价格和」的最小值,总价值减去最小割即可。

ABC239G Builder Takahashi *

要注意输出方案的时候可能会有形成内部的环的流,不能输出。

洛谷 P4313 文理分科

洛谷 P1646 [国家集训队] happiness *

CF311E Biologist *

每个人建立一个点(想成二分图了,这样会导致可能会同时割掉一个人的文理), S S S 向它们连容量为理科的边权,它们向 T T T 连文科的边权。

对于同文同理,新建点即可。

ABC193F Zebraness

这题是不同 + 1 +1 +1,所以可以通过间隔反色变为相同 + 1 +1 +1

路径法

  • 特点:各点有分层的特质。
  • 技巧:通过拆点限制经过点的流量,并且在相邻层间连边。

「网络流 24 题」最长递增子序列

第一问 DP。

第二、三问,可以建立 u → v u\to v uv 的边,当且仅当 f v = f u + 1 f_v=f_u+1 fv=fu+1,跑网络流。

但要注意每个点的流量只能为 1 1 1,于是可以把每个点拆为入点和出点,入点向出点连一条容量为 1 1 1 的边。

费用流模型

const int N=1000005,M=2000005;
int head[N],ver[M],edge[M],cost[M],nxt[M],tot=1,S,T,dis[N],flow[N],pre[N],Maxflow,Mincost;
bool vis[N];
void add(int u,int v,int w,int c){ver[++tot]=v,edge[tot]=w,cost[tot]=c;nxt[tot]=head[u],head[u]=tot;
}
void append(int u,int v,int w,int c){add(u,v,w,c);add(v,u,0,-c);
}
void init(){for (int i=2;i<=tot;i++) ver[i]=edge[i]=cost[i]=nxt[i]=0;for (int i=1;i<=T;i++) head[i]=dis[i]=flow[i]=pre[i]=vis[i]=0;Maxflow=Mincost=0,tot=1;
}
bool SPFA(){queue<int> q;for (int i=1;i<=T;i++) dis[i]=1e9,flow[i]=0;dis[S]=0,flow[S]=1e9,q.push(S),vis[S]=1;while (!q.empty()){int u=q.front(); q.pop();vis[u]=0;for (int i=head[u];i;i=nxt[i]){int v=ver[i],w=edge[i],c=cost[i];if (dis[v]>dis[u]+c&&w){dis[v]=dis[u]+c;flow[v]=min(flow[u],w);pre[v]=i;if (!vis[v]) vis[v]=1,q.push(v);}}}return dis[T]<1e9;
}
void MCMF(){Maxflow=Mincost=0;while (SPFA()){Maxflow+=flow[T];Mincost+=dis[T]*flow[T];for (int i=T;i!=S;i=ver[pre[i]^1]) edge[pre[i]]-=flow[T],edge[pre[i]^1]+=flow[T];}
}

类二分图

  • 模型转化:二分图完美匹配(满配情况下权值和取极值)

「网络流 24 题」分配问题 *

二分图完美匹配。

「网络流 24 题」运输问题 *

「网络流 24 题」负载平衡 *

二分图 + 最大 / 小化权值和。

路径法

  • 技巧:拆点。若每个点的权值只能取一次,但可多次经过,就建立 2 2 2 种边。

「网络流 24 题」航空路线 *

可以给一个点内部的边设立一个费用,即可求出取到最大流 2 2 2 的前提下经过点的数量的最大值。

「网络流 24 题」数字梯形 *

拆点。

「网络流 24 题」最长 k 可重区间集

限制每个点的流量,只需要让它连向后继的边容量设为 k k k

「网络流 24 题」最长 k 可重线段集 *

由于存在垂直 x x x 轴的线端,所以得通过把 x x x 轴上的每个点拆成 2 2 2 个点处理。


http://www.ppmy.cn/server/166075.html

相关文章

【配置环境】VS Code中JavaScript环境搭建

一&#xff0c;环境 Windows 11 家庭中文版&#xff0c;64 位操作系统, 基于 x64 的处理器VS Code 版本: 1.83.1 (user setup)Node.js 版本&#xff1a;20.9.0 二&#xff0c;为什么搭建JavaScript环境 因为在看《重构改善既有代码的设计第2版》的时候&#xff0c;书中的代码展…

ES6 Set 数据结构用法总结

1. Set 基本概念 Set 是 ES6 提供的新的数据结构&#xff0c;类似于数组&#xff0c;但成员的值都是唯一的&#xff0c;没有重复的值。Set 本身是一个构造函数&#xff0c;用来生成 Set 数据结构。 1.1 基本用法 // 创建一个空Set const set new Set();// 创建一个带有初始…

预防和应对DDoS的方法

DDoS发起者通过大量的网络流量来中断服务器、服务或网络的正常运行&#xff0c;通常由多个受感染的计算机或联网设备&#xff08;包括物联网设备&#xff09;发起。 换种通俗的说法&#xff0c;可以将其想象成高速公路上的一次突然的大规模交通堵塞&#xff0c;阻止了正常的通勤…

java中equals和hashCode为什么要一起重写

文章目录 equals&#xff08;&#xff09;方法常见的重写规则&#xff1a; hashCode&#xff08;&#xff09;方法为什么通常需要一起重写 equals() 和 hashCode()&#xff1f;一致性要求哈希表的工作原理避免错误的行为例子说明总结 equals&#xff08;&#xff09;方法 equa…

2025 IT职业发展方向及推荐

一、云计算与DevOps&#xff08;推荐指数&#xff1a;★★★★★&#xff09; 推荐理由&#xff1a; 市场需求&#xff1a; 据Gartner报告&#xff0c;2025年全球公有云市场规模将突破8300亿美元&#xff0c;但混合云管理人才缺口达400万&#xff08;IDC数据&#xff09;。 企…

golang命令大全12--命令速查表

至此&#xff0c;本系列博文已将golang的各种应用场景的命令都介绍了一遍&#xff0c;通过熟练使用这些命令&#xff0c;开发者可以更高效地开发、测试和维护Go项目&#xff0c;同时也能够更好地理解和学习Go语言的特性和最佳实践。因此&#xff0c;掌握Go命令行工具是成为一名…

还搞不透stm32单片机启动过程?一篇文章几百字让你彻底看懂!

1.stm32启动 1.1 msp和pc的初始值&#xff0c;第一步&#xff1a; 2.boot的值就被锁定了 可以根据实际绑定的值变动&#xff0c; 这里补充一点boot1和0的原理&#xff1a; 1.2来点刺激的&#xff1a; 这里我插入一个链接&#xff1a; 【明解STM32】一文搞明白STM32芯片存储…

Android Studio 2024.2.2.13版本安装配置详细教程

Android Studio 是由 Google 官方开发和维护的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为 Android 应用开发设计。它是基于 JetBrains 的 IntelliJ IDEA 平台构建的&#xff0c;集成了丰富的工具和功能&#xff0c;帮助开发者高效构建、调试、测试和发布 Androi…