A - Drainage Ditches POJ - 1273 简单模板题
B - Friendship POJ - 1815
大致题意:时限2秒,给出200个点,5000 条边的无向图,以及S和T,问将S和T分割开来最少需要删去多少个点,以及最小字典序的割点集合
建图方法:每个点分割成入点和出点,之间连容量为1的边;对于原来的图中的连边,则从起点的出点 向 终点的入边建立一条容量为极大值的边。
直接建立图,求最小字典序的割边的集合时,按顺序依次将每条边从图中暂时拿去,重新建图再跑最大流,如果此时的最大流比前一次的最大流小的话,则该条边是割边,并将其从图中永久删去。直到最大流为0的时候停止寻找割边。
C - Reactor Cooling ZOJ - 2314 上下界网络流裸题
D - Number HYSBZ - 3275
题意:
有N(n<=3000)个正整数,需要从中选出一些数,使这些数的和最大。若两个数a,b同时满足以下条件,则a,b不能同时被选
1:存在正整数C,使aa+bb=c*c
2:gcd(a,b)=1
解法:如果两个数互质,则这两个必定一个为奇,一个为偶,则可以将数分为两类,源向代表奇数的点连一条容量为该点的数值的边,代表偶数的点向汇连一条容量为该点的数值的边。如果某两个数满足题目给出的条件,则在这两个数对应的点之间建立一条容量为极大值的边。于是,如果存在从S到T的流量就意味着存在一对满足关系的点。最后求出最小割,就是意味着把所有满足关系的点对的其中一个去掉的最小代价。再用所有的数值之和减去最小代价就是该题的答案。
E - 软件开发 HYSBZ - 1221
大致题意:有n天,每天需要
a
[
i
]
a[i]
a[i]块消毒毛巾,有3种消毒毛巾的获取方法:
- 直接购买新的消毒毛巾,每块消毒毛巾费用为f
- 把这一天有的毛巾进行消毒,经过a天,每块消毒毛巾费用为fa
- 把这一天有的毛巾进行消毒,经过b天,每块消毒毛巾费用为fb
问经过n天以后最小总费用为多少。
解法:将每个点分成A点和B点,所有的A点向汇点连一条容量为 a [ i ] a[i] a[i],费用为0的边;从源点向每个A点连一条容量为极大值,费用为 f f f的边;从源点向每个B点连一条容量为 a [ i ] a[i] a[i],费用为 0 0 0的边;所有的 B [ i ] B[i] B[i]点向 A [ i + a + 1 ] A[i+a+1] A[i+a+1]点连一条容量为极大值,费用为 f a fa fa的边;所有的 B [ i ] B[i] B[i]点向 A [ i + b + 1 ] A[i+b+1] A[i+b+1]点连一条容量为极大值,费用为 f b fb fb的边;所有的 B [ i ] B[i] B[i]点向 B [ i + 1 ] B[i+1] B[i+1]点连一条容量为极大值,费用为 0 0 0的边。
F - 修车 HYSBZ - 1070
经典的工程问题
解法:把每个代表工人的点拆成n个点,分别代表第1,2,3…n次修理,每辆车向这些点连容量为1,费用为 g [ i ] [ j ] ∗ k g[i][j]*k g[i][j]∗k,表示第 i i i个工人倒数第 k k k次修理的车辆为第 j j j辆给总等待时间带来的增量。然后从源点向所有代表车辆的点连容量为1,费用为0 的边,所有代表工人的点向汇点连容量为1,费用为0 的边。
G - Firing POJ - 2987
大致题意:开除每个员工会带来对应的收益或者损失,开除一个员工同时也会开除其所有的下属,下属的下属…给出开除员工的收益或损失,以及上司和下属关系(一个员工可能会有多个上司),问开除员工的最大收益是多少,获得最大收益时最少需要开除多少员工。
解法:从源点向所有开除后获得收益的员工连一条容量为收益量的边;所有开除后导致损失的员工向汇点连一条容量为损失量的边;对于所有的下属关系建立一条从上司到下属,容量为极大值的边。则答案为收益的总和减去最大流。其中开除的员工即为,去掉所有的满流边以后,和S相连的点。
理解:假设只有一个员工会带来收益,则如果从该点到汇点的最小割大于其收益,也就是源点到该点的边满流了,表示开除该员工带来的总利润为非正数,为答案带来的总利润为收益值减去最小割,也就是0;
相对应的,如果源点到该点没有满流,表示开除该员工带来的总利润为正值,为答案带来的总利润值为收益值减去最小割。
对于一个可以带来收益的员工的集合也是一样的。
H - Being a Hero HDU - 3251
给出一个图(n<=1e3,m<=1e5),每条边都带有边权,有些点有收益值,问删去某些边以后,和1号点相隔离的点的收益之和减去删去的边的边权之和最大为多少,以及删去哪些边。
解法:定1号点为源点,从所有的收益点向汇点连容量为收益值的边,其他点之间的连边的容量为该边的边权。答案是所有的收益点的收益之和减去最大流,删去的边为那些,跑完最大流以后的残量网络中,从1号点可达的点到1号点到不可达的点的满流边。
理解:先考虑只有一个收益点的情况下,则如果从1号点到该收益点的最小割大于其收益,即将这个收益点和1号点隔开的总利润为负数,否则利润为正数。再考虑对于一个收益点的集合,也是一样的。
I - 志愿者招募 HYSBZ - 1061
大致题意:
给定长度为n的目标序列A,和m种操作,每种操作可以使用无限次,每次操作可以将序列
L
[
i
]
L[i]
L[i]到
R
[
i
]
R[i]
R[i]的值加1,费用为
C
[
i
]
C[i]
C[i]。初始序列B长度为n,值全为0。问序列B进行操作后,直到对于所有
1
≤
i
≤
n
{1 \le i \le n}
1≤i≤n都满足
B
[
i
]
≥
A
[
i
]
B[i] \ge A[i]
B[i]≥A[i]所需的最小代价和。
解法:先把序列A做一次差分,对于每个差分后的 A [ i ] A[i] A[i],如果为负数,则从源点向 i i i点连一条容量为 ∣ A [ i ] ∣ |A[i]| ∣A[i]∣,费用为0的边;如果为正数,则从 i i i点向汇点连一条容量为 A [ i ] A[i] A[i],费用为0的边。从每个 r [ i ] + 1 r[i]+1 r[i]+1点向 l [ i ] l[i] l[i]点连一条容量为极大值,费用为 C [ i ] C[i] C[i]的边。最后从点 i i i向点 i + 1 i+1 i+1连一条容量为极大值,费用为0的边。
理解:到每个节点的流量可以理解为当前点的差分值。而题目要求为每个当前差分值都不少于序列A的差分序列B对应的
B
[
i
]
B[i]
B[i]。对于每个
B
[
i
]
B[i]
B[i],如果为正数,则从对应的点向汇点连容量为
B
[
i
]
B[i]
B[i],费用为0的边,表示限制该点的当前差分值不应该少于
B
[
i
]
B[i]
B[i],否则从源点向该点连容量为
−
B
[
i
]
-B[i]
−B[i],费用为0的边,表示从该点以后的当前差分值都可以相对地提高
−
B
[
i
]
-B[i]
−B[i],这个稍微想一下就可以知道为什么了。而操作则对应的转化为了从后向前连的边,表示将右端点的当前差分值降低,左端点的当前差分值提升,在原序列上就表现为区间加法。
注意在建图的时候需要将差分得到的第n+1个点也要考虑进去。