网络流
文章平均质量分 84
AC_Arthur
Die luft der Freiheit weht
展开
-
1515 - Pool construction(最大流最小割模型)
该题是一道经典的最小割题目 。 最近学习图论以来一直不是很明白最小割是什么,通过该题,有了一定的认识 。首先我们要知道最大流最小割定理 :对于任意一个只有一个源和一个汇的图来说,从源到汇的最大流等于最小割 。也就是说,对于一个图中的两个集合AB,通过删除一些边让他们恰好不连通,那么删掉的这些边就叫做他们的割了 。 那么最小割和网络流有什么关系呢? 为什么最小割定理是对的呢? 其实很简单原创 2015-08-23 17:10:08 · 1406 阅读 · 0 评论 -
POJ 3469 Dual Core CPU(最小割)
题目链接:点击打开链接题意:有n个模块要在A或B上运行, 费用分别是a[i]和b[i], 还有m个关系, 如果a[i]和b[i]不在同一个CPU上执行, 那么需要额外花费c[i]。 求最小花费。思路:首先, 很显然的是, 要把模块分成两个集合, 有一些属于A, 有一些属于B,这种将对象划分成两个集合的问题, 我们常用最小割来解决, 那么对于每个模块, 如果它属于A, 为了割断 , 要将他原创 2016-03-24 15:51:37 · 1545 阅读 · 0 评论 -
POJ 3422 Kaka's Matrix Travels(拆点+最大流)
题目链接:点击打开链接题意:给一个nXn的矩阵, 每个点有一个值, 让你从(1,1)走到(n,n)走k次, 每次只能向右或者向下走, 走到一个数字, 就得到那个值, 并且这个地方走第二次的时候不会再次获得该值, 求能得到的最大值。思路:走k次这限制我们可以用流量来解决, 关键是费用问题, 解决方法是拆点 —— 解决结点容量或者费用的通法。细节参见代码:#include#inc原创 2016-03-24 16:28:24 · 1052 阅读 · 0 评论 -
HDU 5855 Less Time, More profit(最大权闭合子图)
题目链接:点击打开链接思路:最大权闭合子图的裸题, 给个学习资料:点击打开链接当结点即有正权值又有负数权值时, 怎么求任意闭合子图的最大和呢? 只要求出最小割E, 用总的正数权值TOT 减去E就是答案。细节参见代码:#include#include#include#include#include#include#include#include#include原创 2016-08-17 21:06:00 · 870 阅读 · 0 评论 -
UVA 10888 - Warehouse(最小费用流)
题目链接:点击打开链接思路:乍看该题, 很明显是个匹配问题, 但是难点在于, 你把一个箱子移动到仓库的路径上有可能存在其他箱子。但是再仔细一想, 假设A到B的路上有个C, 那么我们可以看作是A移动到C, 然后把C移动到B, 所以这种情况是不影响答案的。细节参见代码:#include #include #include #include #include #includ原创 2016-09-02 14:25:20 · 737 阅读 · 0 评论 -
POJ 3422 Kaka's Matrix Travels(费用流)
题目链接:点击打开链接思路:我们用流量来限制走的次数, 因为权值在结点上, 我们考虑拆点, 因为每个点的权值只能获得一次, 我们对于每个点连两条边, 一条容量为1费用为权值, 一条容量为k-1,费用为0, 跑最大费用流就行了。细节参见代码:#include #include #include #include #include #include #include #原创 2016-09-14 12:50:15 · 556 阅读 · 0 评论 -
UVA 1194 - Machine Schedule(最大流)
题目链接:点击打开链接思路:看这些约数条件和数据范围, 很容易联想到网络流。 我们如果把流量当作答案, 那么最小割等于最大流, 我们考虑如何构建最小割。 因为每个工作的顺序随意, 所以我们只需要调整到某一个模式一次即可。 那么我们用源点到模式的流量来限制, 容量为1, 把第二个机器的模式和汇点相连,容量为1, 这样, 对于每一个工作, 向两个机器连容量为1的边, 那么对于一个原创 2016-09-14 19:43:29 · 814 阅读 · 0 评论 -
UVA 10983 - Buy one, get the rest free(网络流)
题目链接:点击打开链接思路: 由于买一个价钱为p的航班, 那么所有对于所有价格细节参见代码:#include #include #include #include #include #include #include #include #include #include #include #include #include #include #inc原创 2016-09-03 21:57:53 · 796 阅读 · 0 评论 -
SGU 210. Beloved Sons(二分图匹配)
题目链接:点击打开链接思路:本题可以用网络流来解, 从源点向每个王子连一条容量为国王喜爱程度的边, 每个王子向每个他喜欢的女孩也连一条容量为喜爱程度的边, 每个女孩向汇点连一条容量INF的边。一个更简单的方法是: 考虑匈牙利算法从1~n, 一定会尽量满足前面的人, 所以我们只需要按照国王对王子的喜爱程度排序之后做匈牙利算法即可。细节参见代码:#include#include原创 2016-09-06 22:11:30 · 535 阅读 · 0 评论 -
UVA 1161 - Objective: Berlin(最大流)
题目链接:点击打开链接思路:一看这些约束条件和数据量, 我们就想到了网络流。由于有时间, 我们可以构造二元组(u, t)表示在城市u,时间t这个状态, 以这样的二元组作为结点跑最大流, 可惜这样结点高达150*24*60, 会TLE。我们可以考虑枚举任意两个航线, 如果满足关系, 就建边, 跑最大流。考虑到每个航线只能经过一次, 我们把航线当作结点, 拆点跑最大流即可。细原创 2016-09-20 16:24:41 · 912 阅读 · 0 评论 -
UVA 1221/HDU 2413/POJ 3343 Against Mammoths(二分+二分图匹配)
题目链接:点击打开链接思路:由于人类星球和外星球是一一对应的, 自然想到二分图匹配, 但是如果匹配, 必须是某人类星球能打赢某外星球才连边。 因为星球上的飞船数量随时间变化, 所以先考虑把时间固定, 然后就可以分类讨论求出在T时间内的最大匹配。 由于在T时间内能胜利, 那么大于T时间也一定能, 二分即可。细节参见代码:#include #include #includ原创 2016-10-10 12:39:59 · 884 阅读 · 0 评论 -
UVA 10779 - Collectors Problem(网络流)
题目链接:点击打开链接思路:我们以1~m建立一列结点,表示Bob的物品, 以2~n建立一列结点, 表示其他的人。 源点和1~m相连, 容量为Bob的初始数量; 汇点也和1~m相连, 容量为1, 表示最终种类的限制, 如果有一个人i有物品j, 那么i向j连容量为i拥有的个数-1,表示只会给他重复的物品; 否则, j向i连容量为1的边, 表示最多给i一个(不要重复的)。 细节参见代码:原创 2016-10-21 16:05:40 · 543 阅读 · 0 评论 -
1349 - Optimal Bus Route Design(二分图最小权完美匹配)
该题是一道典型的二分图最小权完美匹配问题 。每个点恰好属于一个有向圈,意味着每个点都有一个唯一的后继 。某个东西恰好有唯一的.....这便是二分图匹配的特点 。将每个结点拆成Xi和Yi,则原图中的有向边u->v对应二分图中的边Xu->Yv 。当流量满载时存在,存在完美匹配,否则不存在 。 网络流这类题目的难点在于将实际问题转化成理论模型,即建图过程 。 要想看出是二分图题目,就要明白这类题原创 2015-08-22 21:42:40 · 1876 阅读 · 0 评论 -
HDU-1533 Going Home(二分图匹配)
最近开始做最小费用流的题目,该题是二分图完美匹配下的最小权匹配,所谓完美匹配就是说从源点流入的总流量等于从汇点流出的总流量,在这种状态下的最小费用 。 那么显然是要套用最小费用流模板,另外二分图匹配的第一步就是要划分集合,划分两个集合,集合A与源点相连,集合B与汇点相连,至于容量和权值就要依据题目而定 。比如该题,因为每个小人恰好能对应一个房子,所以每个小人与汇点的容量为1,房子与汇点的容原创 2015-08-21 10:32:31 · 889 阅读 · 0 评论 -
753 - A Plug for UNIX (最大流或二分图匹配)
紫书上网络流部分的第一道例题, 刚刚学了最大流,还没有理解二分图匹配 , 这里就只说一下我用最大流是怎么做的吧 。我们可以假想一个源点,一个汇点,然后对于每一个设备的插头,从源点连一条线,对于每个插座,连一条线到汇点,且容量都为1 。原创 2015-08-20 18:47:03 · 965 阅读 · 0 评论 -
1660 - Cable TV Network(最大流最小割)
该题又是一道经典的最小割问题,不过不是割边而是割点 。问题是:最少删除几个点可以让图不连通 。 我们都知道最大流对应着最小割,所以重点在于建模 。为了形成割,那么必须让点具有“流量”的性质,怎么做呢? 对,拆点 。 和例题1658类似的方法,我们将每个点拆成两个点,连一条容量为1的边,那么每个点就被赋予了流量的性质,这次我们反而要令边的容量为无穷大,因为要删除点而不是边 。 另外因为我们不原创 2015-08-24 10:31:19 · 1606 阅读 · 0 评论 -
820 - Internet Bandwidth(最大流模板题)
最大流裸题,紫书上的图有问题,差点坑到我。。给出Dinic算法模板,比较高效的最大流算法,复杂度为O(v^2*E),而实际上Dinic算法比这个理论界要好得多。 紫书上的Edmonds-Karp算法的复杂度是O(v*E^2),对于边较多的题目来说显然不够高效。细节参见代码:#includeusing namespace std;typedef long long ll;const原创 2015-08-23 19:57:14 · 1063 阅读 · 0 评论 -
HDU 5093 Battle ships(二分图匹配)
该题是一道经典的二分图匹配题目 。 同一列(行)上不能放两个船除非有冰山隔着。对于这种二维平面图,我们很容易想到将行和列分成两个集合,进行二分图匹配,当一个行坐标匹配到一个列坐标时,该格子可以放置船。那么为了使任意两个船都不在同一行或者同一列,除非有冰山,我们可以将每一行中一块连续的只能放置一个船的区域都设成一个编号,同样的按照列也这样处理,这样就相当于将行和列缩点了,接下来用最大流模板套一套就原创 2015-08-27 08:44:27 · 1603 阅读 · 0 评论 -
12549 - Sentry Robots (二分图匹配)
该题和HDU 5093 如出一辙 传送门 。即求解二分图最大匹配数 = 最小点集覆盖 。 该题要求用尽量少的机器人看守所有重要的点,并且障碍物会阻隔机器人的看守范围 。我们不妨将行列分开,按照行和列的最大看守范围编号,这样得到的就是最大匹配数 。 由于要求看守所有重要的点,所以这样可以有效去重,进行了最大匹配之后还可以保证一定看守了所有的点 。 建好图之后套Dinic模板就行了 。该题原创 2015-08-27 09:23:08 · 1477 阅读 · 0 评论 -
UVA 1658 - Admiral (拆点+最小费用流)
该题中的拆点法是解决几点容量的通用方法 。 因为只有容量限制的话仍然不能满足每个结点只访问一次这个限制 ,原因很简单,大家画个图就知道了,假设从起点有两条路到同一个结点2,然后又都到末点n,虽然它们满足流量限制但是经过了同一个结点。 那么怎么解决这个问题呢? 答案是:拆点法 。将一个结点拆成两个结点,由真结点连一条容量为1费用为0的边到假结点,这样之后当我们加边的时候,另起始结点为假结点原创 2015-08-21 20:53:55 · 2066 阅读 · 1 评论 -
HDU 2732 Leapin' Lizards(拆点法+最大流)
该题是一道比较简单拆点+最大流的题目,因为每个柱子都有一定的寿命,很容易将其对应成流量,那么处理结点容量的一般方法当然是拆点法 。该题反而对边的容量没有要求,为保险起见可以设成无穷大。 该题的思路很好想,建议独立编写代码 。推荐题目: 点击打开链接 结点法的一些见解 也可以看这里。细节参见代码:#includeusing namespace std;typedef lon原创 2015-08-30 17:13:39 · 1352 阅读 · 0 评论 -
HDU 3572 Task Schedule(最大流Dinic算法)
该题非常经典,建图的方法非常巧妙,因为每个任务的完成不一定要连续,而且可以换机器完成,而且我们注意到时间点最多500,很小,所以我们将时间点抽出来建图。对于每个任务,将其时间范围内的点与之连起来,容量显然为1 ,并与汇点相连,容量为p[i] 。 对于每个时间点,因为最多可以有m台机器同时工作,所以容量为m 。一开始老想着任务和机器之间怎么建立联系了。细节参见代码:#include原创 2015-08-30 20:54:06 · 1343 阅读 · 0 评论 -
HDU 1532 Drainage Ditches(基础最大流)
最近开始学习图论,到了网络流部分 。该部分比较难,难度在于有点看不懂, 不过这没有关系,慢慢看,先刷几道水题,将模板中需要注意的地方考虑好 。 之后再刷紫书提高 。 逐步加深对网络流的理解 。 该题非常简单,套上模板就过了 。我第一次写最大流模板,理解的还不深刻,下面的注释是我对代码的理解。细节参见代码:#include#include#include#inclu原创 2015-08-19 21:26:56 · 1071 阅读 · 0 评论 -
HDU 1565 方格取数(1)(最大独立点权覆盖 | 最小割)
该题是一道经典的求最大点权独立集问题的题目 。 关于定义我就不多说了 。 说一下几个重要的关系 :1.最大流 = 最小割 = 最小点权覆盖集 = sum - 最大点权独立集 。因此,该题其实还可以用最小割来做,思想是相同的 。 因为我们不能取相邻的数字,所以很容易联想到最小割 。那么我们可以先给每个格子编号1或2,形成二分图。 然后由1到2连边 。容量INF,与源点和汇点相连的原创 2015-08-31 10:24:35 · 998 阅读 · 1 评论 -
POJ 1815 Friendship(最小割+拆点法)
题意:求拆除几个点可以使得s和t不连通。典型的最小割问题,不过该题不是删除边而是删除点,又是结点容量问题,所以我们用拆点法来解决 。 对于最小割问题,也做了不少了,说说我的理解吧: 就是通过最大流算法,让两部分不连通的最小流量,所以我们可以将割裂一个点的费用表示成容量,像该题,我们要拆掉一个人,那么让结点容量为1就好,至于其他的边,因为与边无关,所以设为INF 。 该题的难点在于要原创 2015-09-01 20:29:55 · 1015 阅读 · 0 评论 -
11082 - Matrix Decompressing (网络流建模|二分图匹配)
该题是一道经典的二分图匹配的题目 。现在终于有点明白什么是二分图匹配了,其实说白了就是依赖于最大流算法之上的一种解决特定问题的算法 。 所谓二分图,就是我们假定有两个集合A和B,每个集合中有若干元素(点),其中源点与A相连,汇点与B相连,并且他们的总容量决定了最终答案的上限,所以一定要维护好 。 然后由A中的点向B中的点连线,他们之间也有一定的容量制约关系(具体看题目中的边权值限制)。这样就可以求原创 2015-08-20 21:06:36 · 1122 阅读 · 0 评论 -
UVA 1212 - Duopoly(最小割)
题目链接:点击打开链接思路:看这些限制条件, 我们很容易想到二分图, 两个公司分别建立两列结点, 表示每个订单。 关键是每个资源只能为一个公司所有,而且一旦买了一个订单, 所有资源都要全买。根据最小割, 我们如果在冲突的订单(存在相同资源)间连一条容量INF的边, 那么割掉的边就是受益最小的, 最终求出来的是最小受益, 用总的减去最小受益就行了。细节参见代码:#inclu原创 2016-10-02 19:27:59 · 665 阅读 · 0 评论