PKU 1149, PIGS,构造网络流模型时,要注意合并节点和边

ps: 本解题报告摘自  (点击上一行)

这道题目的大意是这样的:

  • 有 M 个猪圈(M ≤ 1000),每个猪圈里初始时有若干头猪。
  • 一开始所有猪圈都是关闭的。
  • 依次来了 N 个顾客(N ≤ 100),每个顾客分别会打开指定的几个猪圈,从中买若干头猪。
  • 每个顾客分别都有他能够买的数量的上限。
  • 每个顾客走后,他打开的那些猪圈中的猪,都可以被任意地调换到其它开着的猪圈里,然后所有猪圈重新关上。

问总共最多能卖出多少头猪。

举个例子来说。有 3 个猪圈,初始时分别有 3、 1 和 10 头猪。依次来了 3 个顾客,第一个打开 1 号 和 2 号猪圈,最多买 2 头;第二个打开 1 号 和 3 号猪圈,最多买 3 头;第三个打开 2 号猪圈,最多买 6 头。那么,最好的可能性之一就是第一个顾客从 1 号圈买 2 头,然后把 1 号圈剩下的 1 头放到 2 号圈;第二个顾客从 3 号圈买 3 头;第三个顾客从 2 号圈买 2 头。总共卖出 2 + 3 + 2 = 7 头。□

不难想像,这个问题的网络模型可以很直观地构造出来。就拿上面的例子来说,可以构造出图 1 所示的模型(图中凡是没有标数字的边,容量都是 +∞):

  • 三个顾客,就有三轮交易,每一轮分别都有 3 个猪圈和 1 个顾客的节点。
  • 从源点到第一轮的各个猪圈各有一条边,容量就是各个猪圈里的猪的初始数量。
  • 从各个顾客到汇点各有一条边,容量就是各个顾客能买的数量上限。
  • 在某一轮中,从该顾客打开的所有猪圈都有一条边连向该顾客,容量都是 +∞。
  • 最后一轮除外,从每一轮的 i 号猪圈都有一条边连向下一轮的 i 号猪圈,容量都是 +∞,表示这一轮剩下的猪可以留到下一轮。
  • 最后一轮除外,从每一轮被打开的所有猪圈,到下一轮的同样这些猪圈,两两之间都要连一条边,表示它们之间可以任意流通。
图 1

不难想像,这个网络模型的最大流量就是最多能卖出的数量。图中最多有 2 + N + M × N ≈ 100,000 个节点。□

这个模型虽然很直观,但是节点数太多了,计算速度肯定会很慢。其实不用再想别的算法,就让我们继续上面的例子,用合并的方法来简化这个网络模型。

首先,最后一轮中没有打开的猪圈就可以从图中删掉了,也就是图 2 中红色的部分,显然它们对整个网络的流量没有任何影响。

图 2

接着,看图 2 中蓝色的部分。根据我总结出的以下几个规律,可以把这 4 个点合并成一个:

规律 1. 如果几个节点的流量的来源完全相同,则可以把它们合并成一个。

规律 2. 如果几个节点的流量的去向完全相同,则可以把它们合并成一个。

规律 3. 如果从点 u 到点 v 有一条容量为 +∞ 的边,并且 u 是 v 的唯一流量来源,或者 v 是 u 的唯一流量去向,则可以把 u 和 v 合并成一个节点。

根据规律 1,可以把蓝色部分右边的 1、 2 号节点合并成一个;根据规律 2,可以把蓝色部分左边的 1、 2 号节点合并成一个;最后,根据规律 3,可以把蓝色部分的左边和右边(已经分别合并成了一个节点)合并成一个节点。于是,图 2 被简化成了图 3 的样子。也就是说,最后一轮除外,每一轮被打开的猪圈和下一轮的同样这些猪圈都可以被合并成一个点。

图 3

接着,根据规律 3,图 3 中的蓝色节点、2 号猪圈和 1 号顾客这三点可以合并成一个;图 3 中的两个 3 号猪圈和 2 号顾客也可以合并成一个点。当然,如果两点之间有多条同向的边,则这些边可以合并成一条,容量相加,这个道理很简单,就不用我多说了。最终,上例中的网络模型被简化成了图 4 的样子。□

图 4

让我们从图 4 中重新总结一下构造这个网络模型的规则:

  • 每个顾客分别用一个节点来表示。
  • 对于每个猪圈的第一个顾客,从源点向他连一条边,容量就是该猪圈里的猪的初始数量。如果从源点到一名顾客有多条边,则可以把它们合并成一条,容量相加。
  • 对于每个猪圈,假设有 n 个顾客打开过它,则对所有整数 i ∈ [1, n),从该猪圈的第 i 个顾客向第 i + 1 个顾客连一条边,容量为 +∞。
  • 从各个顾客到汇点各有一条边,容量是各个顾客能买的数量上限。

拿我们前面一直在讲的例子来说:1 号猪圈的第一个顾客是 1 号顾客,所以从源点到 1 号顾客有一条容量为 3 的边;1 号猪圈的第二个顾客是 2 号顾客,因此从 1 号顾客到 2 号顾客有一条容量为 +∞ 的边;2 号猪圈的第一个顾客也是 1 号顾客,所以从源点到 1 号顾客有一条容量为 1 的边,和之前已有的一条边合并起来,容量变成 4;2 号猪圈的第二个顾客是 3 号顾客,因此从 1 号顾客到 3 号顾客有一条容量为 +∞ 的边;3 号猪圈的第一个顾客是 2 号顾客,所以从源点到 2 号顾客有一条容量为 10 的边。□

新的网络模型中最多只有 2 + N = 102 个节点,计算速度就可以相当快了。可以这样理解这个新的网络模型:对于某一个顾客,如果他打开了猪圈 h,则在他走后,他打开的所有猪圈里剩下的猪都有可能被换到 h 中,因而这些猪都有可能被 h 的下一个顾客买走。所以对于一个顾客打开的所有猪圈,从该顾客到各猪圈的下一个顾客,都要连一条容量为 +∞ 的边。

在面对网络流问题时,如果一时想不出很好的构图方法,不如先构造一个最直观,或者说最“硬来”的模型,然后再用合并节点和边的方法来简直化这个模型。经过简化以后,好的构图思路自然就会涌现出来了。这是解决网络流问题的一个好方法。

POJ1149 PIGS 题解相关推荐

  1. POJ1149 PIGS(最大流)

    题意:       有一个人,他有m个猪圈,每个猪圈里面有一定数量的猪,但是每个猪圈的门都是锁着的,他自己没有钥匙,只有顾客有钥匙,一天依次来了n个顾客,(记住是依次来的)他们每个人都有一些钥匙,和他 ...

  2. POJ1149 PIGS

    luogu:嘟嘟嘟 poj:嘟嘟嘟 这是一道简化模型好题,这篇论文讲的太好了:网络流建模汇总,感觉我已经无需多讲. 但我这个代码没有合并相同边的容量,不过节点数是最少的. 1 #include< ...

  3. 竞赛程序设计知识要点图谱

    一.基础算法 1.枚举法 POJ1248 Safecracker HDU1172 猜数字 POJ1543 Perfect Cubes POJ1046 Color Me Less 2.递归法:Hanoi ...

  4. poj1149迈克卖猪问题(PIGS)

    /** 建图: <1>: 将顾客看作是除源点和汇点的结点,并且另设两个结点,源点和汇点 <2>:源点和每个猪圈的第一位顾客连边,边的权值是开始时猪圈中猪的数量 <3> ...

  5. LeetCode 力扣算法题解汇总,All in One

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: https://fuxuemingzhu.cn 关键词:LeetCode,力扣,算法,题解,汇总,解析 把自己刷过的所有题目做一个整理, ...

  6. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  7. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  8. [JS]题解 | #魔法数字#

    题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...

  9. [JS]题解 | #岛屿数量#

    题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...

最新文章

  1. android 分组 listview,Android实现的ListView分组布局改进示例
  2. 看了看カルタグラ~魂ノ苦悩~(カルタグラ~ツキ狂イノ病~PS2移植版)的官网...
  3. jQuery 表单验证插件,jQuery Validation Engine用法详解
  4. ES的多种搜索机制:query string search,query DSL,query filter,full-text search,phrase search,highlight search
  5. SQLite 简介(http://www.w3cschool.cc/sqlite/sqlite-intro.html)
  6. opencv 创建图像_非艺术家的图像创建(OpenCV项目演练)
  7. Silverlight 3 学习概要
  8. docker部署mysql项目_Docker部署项目步骤
  9. buildroot 编译问题
  10. Win10应用商店无法连接解决方案
  11. 塑料浮船坞行业调研报告 - 市场现状分析与发展前景预测
  12. 开始VC6学习之旅3
  13. 利用EnableQ服务政府民意调查
  14. 嵌入式C编程中的设计模式之二——状态机模式
  15. 网站服务器停止运行,服务器已停止响应是怎么回事
  16. hdu 4747 Pet
  17. qq空间显示手机型号android,手机QQ空间说说怎么显示手机型号
  18. Linux环境下——C语言聊天室项目
  19. pr中创建镜像效果,并用渐变进行过渡
  20. 操作系统实践-BIOS

热门文章

  1. ROC曲线,AUC面积
  2. 微软在2022年Gartner云计算AI开发者服务魔力象限中被评为“领导者”
  3. 媒体对华为不公,国人应该清醒 [转]枯荷雨声
  4. 读书笔记《敏捷项目管理》第七章 定义产品愿景和产品路线图
  5. java获取唯一序列号,Android 获取本机唯一序列号 和可变UUID方法
  6. 我认识的七个理想主义者
  7. 第二章第四题(将磅转换为千克)(convert pound to kilogram)
  8. Druid在有赞的实践
  9. 大曝光!武汉最牛的互联网公司全在这了
  10. APP被Rejected 的各种原因翻译(转)