网络流小结

很久以前做过很多网络流的题目,今天翻出来但是的小结,放在这里温习一下,同时和大家分享一下。

hdu1281
题意:小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是Gardon限制了只有某些格子才可以放,小希还是很轻松的解决了这个问题(见下图)注意不能放车的地方不影响车的互相攻击。 
所以现在Gardon想让小希来解决一个更难的问题,在保证尽量多的“车”的前提下,棋盘里有些格子是可以避开的,也就是说,不在这些格子上放车,也可以保证尽量多的“车”被放下。但是某些格子若不放子,就无法保证放尽量多的“车”,这样的格子被称做重要点。Gardon想让小希算出有多少个这样的重要点,你能解决这个问题么?
难度:2
题解:二分图最大匹配。跑最大流.要使每行每列最多一个车。熟悉二分匹配的人肯定就会想到:把x,y分别当作二分图的两一个部分,最大匹配就是要求的最多的车的数量。这样的原因也很好理解。最大匹配中,每个x点,y点最多只有一条边链接(不包含链接源点和汇点),也就是说,去相同的x或者y,最多只有一个点。要问哪些车是不能没有的,只需要枚举每一个车,如果去掉这个车,最大匹配减小,就是所求的重要点。(转载自http://fayaa.com/code/view/26363/)
hdu1532
题意:给出网络流的一些边,求节点1到节点n的最大流。
难度:0
题解:直接连边求最大流。
hdu1533
题意:地图中有n个小人和n个小房子,每个小人和每个房子之间都有一定的距离,现在要使每个房子都住进一个小人,求这n个小人走进各自房子的距离之和的最小值。
难度:1
题解:二分图最大权匹配。用最小费用最大流求解。设立一个附加源和附加汇,附加源和每个小人连一条流量为1,费用为0的边,每个房子向附加汇连一条流量为1费用为0的边,每个小人向每个房子连一条流量不为0,费用为彼此距离的边,求最小费用最大流。
hdu1569
题意:给你一个m*n的格子的棋盘,每个格子里面有一个非负数。从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取数所在的2个格子不能相邻,并且取出的数的和最大。
难度:1
题解:最大点权独立集。与骑士共存问题相似,用最大流求解。对每个点进行黑白染色,使得每对相邻的点的颜色不同,新建一个附加源s和一个附加汇t,s对所有黑点连一条容量为改点权值的边,所有白点对t连一条容量为改点权值的边,所有黑点对其相邻的点连一条容量无穷大的边,所有点的权值和减去求得的最大流就是答案。
hdu1733
题意:(starfall512.com/?p=320)教室里有很多人,有若干个出口,问所有人最少需要多少时间全部走到教室外面。
难度:4
题解:如果人在出口的位置,就算出去;每个位置每次只能站一个人;先BFS判断是否全部人都能走出去(排除无解的情况)。分层建图,每层代表一个时间点。比如第n层图,首先每个位置的点拆点,两点之间容量为1(为了满足每个点最多一个人)对于每一个位置(x,y),向四个方向(xx,yy),如果不越界并且不是‘#’(wall),就从n-1层的x,y位置建边到n层的xx,yy点,n-1层的(x,y)也要连向n层的(x,y)点,每层建图后计算最大流,最大流就是那个时间点上能够出教室的人数。出教室的总人数需要累加,用来判断跳出循环。可以二分最大层数,也可以一层层累加上去。
hdu1853
题意:在有向图中找若干个环,使得构成这些环的边的权值最小,且满足每个点在这些环中出现且只出现一次,每个环中至少有两个点
难度:2
题解:二分图最优匹配。把每一个点拆成两点Xi和Yi,新增一个附加源s和附加汇t,s向X集合中的所有点连一条容量为1,费用为0的边,Y集合中的所有点向t连一条容量为1,费用为0的边;对于给出的各条边(i,j,w),从Xi向Yj连一条容量不为0,费用为w的边。然后求最小费用最大流,如果最大流为节点数的话,最小费用就是答案,因为对于X[]集合可假设为各点的出度,Y[]集合可以假设为各点的入度,答案能够保证每个点的出度和入度都为1。
hdu2732
题意:你拥有的一些蜥蜴走进了你正在探索的一个迷宫。当你正在寻找迷宫中埋藏着的宝藏时,一只蜥蜴不小心踩到了一块普通的石头,接下来房间里面的地板突然间都消失了。你的每一只蜥蜴都各自被遗留在一根脆弱的柱子上,并且有一团火从下面燃烧了起来...不抛弃任何一只蜥蜴。(你的任务就是)使尽可能多的蜥蜴走出迷宫,并且汇报蜥蜴的伤亡量。迷宫里的柱子对齐地摆放成一个大网格,每一个柱子和他东南西北直接相邻的柱子的距离都是1。边缘的柱子和(安全的)房间的边界的距离也是1。并不是所有的蜥蜴都有幸能够站在一根柱子上。一只蜥蜴能够跳到所有和他距离为d的空柱子上。站在边缘的柱子上的蜥蜴只要跳一下就能跳到安全的地方...但是这里有一个陷阱:每只蜥蜴在自己当前所在的柱子上跳走后这根柱子就会变得更加脆弱甚至会马上倒塌而不能让其他蜥蜴跳到这里来。没根柱子同一时刻只能容纳一只蜥蜴。
难度:1
题解:把每个有容量的点点拆成两个点:出点和入点,出点i向入点i连一条容量为该点权值的边,增加一个附加源s和一个附加汇t,从附加源s向每一个蜥蜴最初所处的位置的出点连一条容量为1的边,从每一个可以跳出边界的点的入点向附加汇t连一条容量无穷大的边。两个可行点i和j之间的距离如果在范围d内,则从i的出点向j的入点两一条容量为无穷大的点。
hdu2883
题意:烤羊肉串店里面来了n个顾客。第i个顾客在Si时刻到来。他/她会订Ni烤肉串,每一串羊肉串需要Ti时间才能烤熟,并且顾客要求在Ei时间前(包括Ei时刻)拿到他/她订的所有羊肉串。烤羊肉串师傅有一个很大的烤架(能容下任意多的羊肉串),但是他有的木炭却没有那么多,所以单位时间内他最多只能同时烤M串羊肉串。帮助烤羊肉串师傅确定他是否能满足所有顾客的需要。注:烤羊肉串不需要连续的时间。
难度:2
题解:该题可以建模成在一个无限长的x轴上初始时每个单位长度的容量是M,然后N个人都要在某一个区间里取走Ni*Ti的容量,问是否存在一种方案满足所有人的要求。(接下来的建图来自网络^_^)将所有的到达时间和结束时间按升序排序,得到 x <= 2n-1 个时间区间。建立网络流模型:s为源,t为汇,每个顾客i作为一个结点并连边(s, i, ni*ti),每个区间j作为一个结点并连边(j, t, (ej-sj)*M),其中sj, ej分别表示区间j的起始时间和终止时间。对任意顾客i和区间j,若 [sj, ej] 完全包含在 [si, ei] 之中,则连边(i, j, INF)。若最大流等于 ∑ni*ti 则是 Yes,否则是 No。
hdu3061
题意:由于小白同学近期习武十分刻苦,很快被晋升为天策军的统帅。而他上任的第一天,就面对了一场极其困难的战斗:据侦查兵回报,前方共有N座城池,考虑到地势原因,最终得到一个结论:攻占某些城池之前必须攻占另外一些城池。事实上,可以把地图看做是一张拓扑图,而攻占某个城池,就意味着必须先攻占它的所有前驱结点。小白还做了一份调查,得到了攻占每个城池会对他的兵力产生多少消耗(当然也可能会得到增长,因为每攻占一个城池,便可以整顿军队,扩充兵力,天策军的兵力十分庞大,如果不考虑收益,他们可以攻取所有的城池)。现在请你帮小白统帅做一份战斗计划,挑选攻打哪些城市,使得天策军在战斗过后军容最为壮大。
难度:2
题解:最大权闭合子图。新建一个附加源s和一个附加汇t,对于所有正权的点,从s向该点连一条权值为该点权值的边,对于所有负权的点,从该点向t连一条权值为该点负权值的边,对于每对依赖关系,如果是先攻占了a才能攻占b,则从a向b连一条权值足够大的边。用所有点的权值和减去最大流就是最大权闭合子图的答案。(可以证明,对于一个有向图,其最大权闭合子图必然包含n个点中的起点,但是我不会,希望有大牛指点)
hdu3081
题意:有2*n个孩子,n个男孩编号1到n,n个女孩编号1到n。女士优先,所以每一女孩可以先选择没有和她产生过矛盾的男孩来组建一个家庭。除此之外,女孩X还可以选择男孩Z入股女孩X的朋友女孩Y没有和男孩Z发生过矛盾。如果a和b是朋友,b和c是朋友,那么a和c也是朋友。每次女孩们选好了男朋友她们都会进行一轮“婚姻匹配”。每一轮结束后,每个女孩都会在她之前没有选择的男孩里面选择一个新的男朋友,下一轮就又开始了。问总共能玩几轮?
难度:3
题解:二分+并查集+最大流。新增一个附加源s和一个附加汇t,女生向所有和她所在的并查集女生没有矛盾的男生连一条容量为1的边,每次从s向每个女生连容量为mid的边,从每个男生向t连容量为mid的边,二分枚举mid(0<=mid<=n),找到最大的mid满足求得的最大流是mid*n。
hdu3277
题意:与hdu3081题意大体相同,只不过增加了一个条件是:每个女孩可以额外选k个男生。
难度:3.5
题解:把每个女生拆分为两个点g,g',两点之间连接边,容量为k。g'链接那些还没有连接过的男生。二分最大配对次数。(题解转自http://starfall512.com/?p=287
hdu3313
题意:给定一个有向图和源汇,求图中割点的个数
难度:4.5
题解:这题比较神,做法是将每个点拆点,然后中间连边流量为1,图中的边连边流量为inf,然后比较特殊的是S和T所拆得点间流量为2。然后这样的话,如果流量为2,那么图中除了S和T没有割点。如果流量为1,那么增广路上的有可能是割点,然后利用求最小割的dfs算法求出各个割。如果流量为0的话,那么说明S和T本来就不连通,所以任何一个点都是割点。(转自edward mj大神的博客http://hi.baidu.com/edward_mj/item/5e9f970e2d1ddec9905718a1)(目前还不会)
hdu3315
题意:一个纯的二分图最优匹配,但是要求在求得的最大匹配的基础上匹配率最大(在这里匹配率指的是Si和Xi匹配的个数占n对匹配的比例)。
难度:3
题解:KM算法。对于每对匹配V[i],我们将其乘以一个较大的数(比如100),然后如果是i对i的匹配,则匹配的边再加上1,因为是最有匹配。最后舍去100后即得到了最优匹配值,又使得匹配率最大。
hdu3338
题意:原数谜是个很有趣的游戏,每一行或每一列空白称为一个回,每一回都对应着一个整数sum,sum就是这回的和。这些空白格里只能填入1—9这九个数字,且在每一回中不能重复。全黑色的格为空,有数字的格,左下角的表示列的和,右上角的表示行的和。但这道题不是原来的数谜,这题与原数谜相比,少了一点规则,就是,每一回中出现的数字可以重复。给你一个n * m 的图,让你填充一下。
难度:4
题解:(转自http://starfall512.com/?p=315)这题挺有意思的告诉我们每行每列之和,要我们求每个点的流量。我的建图方法太麻烦了,不过也先介绍一下。就是把空白的每个点,都当成最大流中的一个点。(构成点集E)所有行和构成点集R,所有列和构成点集C。然后建图:S->R->E->C->T.流量分别是,行和-改行和包含的元素数,8,8,列和-该列和包含的元素数为什么容量是8?为什么要减去元素数?因为我们只能用1-9填空,那么每个格子最少有1。为了把有上下限的网络流(容量最少为1,最多为9)转化为一般的网络流,减去元素数之后,我们要用0-8填空就行了。最后求点集E流向R的流量就是(该点要求的数-1)其实有一种更简单的方法,意思差不多。只是不要点集E,直接行和列相连接。Amb大牛用的就是这种方法,代码比我少了2k。。
hdu3376
题意:给你一个N*N的矩阵,要求从起点(1,1)(往右或下方向)到终点(N,N)再从终点(往左或上)到起点,使一路上走过的点的权值和最大(走过的点可以再走,但是每个点的权值最多只能取一次)。
难度:2
题解:最大费用流。将矩阵上每个点拆成两个点Xi和Yi,从Xi向Yi连一条容量为1,费用为该点权值的负值的边,再连一条容量为1,费用为零的边。对于每个点i, 以及他有侧或下侧的点j(如果有的话)从Yi向Xj连一条容量为2,费用为零的边。新增一个附加源s和一个附加汇t,s向X(1,1)连一条容量为2,费用为零的边,Y(N,N)向t连一条容量为2,费用为零的边。求得的最小费用的负值就是对大费用。
hdu3416
题意:求起点到终点最多有几条可行路,这里可行路的定义是这样一条从起点到终点的路,他是最短路,而且这些可行路之间没有重合的边。
难度:2.5
题解:先以起点和终点为源各求一次单源最短路,然后保留所有的在最短路上的顶点和他们彼此之间的边,把这些保留下来的边的流量设为1, 最后求一次最大流。(暂时TLE)
hdu3435
题意:在一个无向图中找一个最小汉密顿环,使得环的权值和最小。
难度:3
题解:二分图最优匹配。把每个点i拆成两点Xi和Yi,每次连边就连一条Xi到Yj和一条Xj到Yi的有权值的边,用KM算法求解。
hdu3488
题意:在一个有向图中找到一些环,使得图上的每个点都在这些环中的某个环中出现过一次。
难度:2
题解:二分图最优匹配(模板再次TLE)。把每个点i拆成Xi和Yi,新增一个附加源s和一个附加汇t,s连每一个Xi以及每一个Yi连t一条容量为1,费用为0的边;对于每一条边的关系:u->v,从Xu向Yv连一条容量为1,费用为该边权值的边,求最大流。
hdu3549
题意:求最大流。
难度:1
题解:略。
hdu3879
题意;(包括题解转载自starfall512.com/?p=361大神的博客)题目里说:有n座城市,要建base station。建立base station,每座城市的花费分别是pi。对于某对城市a,b,如果两座城市都建了base station,那么就能收益c。问怎么建站使得收益最多。
难度:3
题解:对于题目给的没对城市a,b,收益c,都当作网络流中的一个点,组成点集(mm)对于所有base station都是网络流中的点,组成点集(nn)建边:S->mm,容量为收益;nn->T,容量为基站的费用,对于mm集合中每一个点(m'),都对应两座城市a,b。连边m'->a,m'->b,容量为inf。最终结果就是nn点所有的收益和-最大流(S,T)。
hdu3046
题意:青青大草原上有喜羊羊他们的小羊们还有灰太狼一帮狼,想再要加栅栏使得每只羊和每只狼隔开,求需要的最少的栅栏数量。
难度:2
题解:1连源点,2连汇点,容量无限,各个格子间连边容量为1,求最小割(题解转载自notonlysuccess.com)
hdu3998
题意:(转自http://starfall512.com/?p=395)(同类问题应该来自《线性规划与网络流》24题)同类问题共三问:(1)最长上升子序列长度(2)每个数用一遍,能够得到的最多长度为s的子序列个数(3)同第二问,a[1]与a[n]可用多次
难度:5
题解:拆点后做最大流。第一问DP求出s,并得到每个数的f[i]。新增源点s,汇点t,对于节点i,若f[i]=1,则与源点连一条容量为1的弧,若f[i]=s,则与汇点连一条容量为1的弧,每个点与拆点后所得到的点连一条容量为1的弧,入度与原节点连,出度与拆点后的点连,若(j>i) (a[j]>a[i]) (f[j]=f[i]+1),则I j 之间连一条容量为1的弧。第三问将1与s的容量,1与1’的容量,n与n’的容量修改为+oo,若f[n]=s,则n’与t的容量也为+oo 再算一遍最大流。
hdu4067
题意:在游戏“倩女幽魂”中,有很多随机迷宫,它们都有如下特性:1.迷宫只有一个入口和一个出口;2.所有的路都是无向的;3.对于入口,他的出度等于入度+1;4.对于出口,他的入度等于出度+1;5.其他所有点的出度等于入度。现在给你一个有向图,你的任务是移走一些边使得它变成一个随机迷宫。每条边都有两个权值a和b,如果移走这条边,你会花费b,不然你会花费a。求使地图变成随机迷宫的最小花费。
难度:5
题解:(转载自starvae大神的博客www.starvae.com/?p=288)题解: 用SPFA 或者 最小费用最大流解决。(1).题目的意思是在一个有向图中选择一些边使得每个点的入度出度相同, 出了起点和终点, 我们在起点和终点中加上一条终点指向起点的边就可以了。  我们给每条边定义新的权值, 大小为a-b, 这样我们的任务就转变成在新的图中寻找所有的负环, 然后将它转向为正环, 直到找到所有的负环。 还有一个要求是寻找到的负环中的其中一个必须包含新加上的终点指向起点的边。 这样就能保证起点和终点的度的特殊性。
如果没有包含这条边的负环, 那么就是impossible。用spfa就能解决, 但是速度慢,并且因为有重边的缘故, 判断负环的时候要特别注意一点。 我写了个用了4406 MS,时限给了3S, 如果有人能用SPFA过, 那着实仰慕。
(2).以上是最直接的方法.
下面是直接建图的方法。
我们的答案保存在sum中。
初始时每个点的in[] out[] 都为0, in[i] 表示第i这个点需要in[i]条指向i的边才能满足i这个点的入度平衡。
对于每条边,如果a <= b 那么建 v->u的边,流量为1, 权值为b-a。 sum+= a;
此时, u->v 被翻转, 所以in[v] ++, out[u] ++.
否则 建 u->v的边, 流量为1, 权值为a-b。 sum += b;
此时, u->v 没有被翻转, 所以in[] out[] 不改变
然后添加一条终点指向起点的边, 直接in[s] ++;out[t] ++;
然后新建超级源汇S,T。
对于每个点i, 如果in[i] > out[i] . 建边S->i, 权值为0, 流量为in[i] – out[i];
否则的话 建边 i->T ,权值为0, 流量为out[i] – in[i];
然后跑一次最小费用最大流。
如果最后从S出去的边没有满流的话 就是impossible。
否则答案即为sum+ mincost.

原文地址:https://www.cnblogs.com/tobec/p/3341891.html