最近做了两道网络流神题,里面用了几个非常巧妙的技巧,在今后很多题目中都可以使用得到。
第一题:WC2007石头剪刀布
这题是网络流,简直太难想到了,总之这道题有几个非常巧妙的转化。
首先是补集转化,我要统计一个完全有向图中的三元环的个数,就等于所有环的个数-非三元环的个数。非三元环的个数怎么统计呢?观察三元环的特点,发现一个三元环必然有一个点在这个环中入度为二(出度为二),由此我们便可以得到一个计算三元环的公式(设d[i]为i的入度)
C(3,N)-∑C(2,d[i])
=n*(n-1)*(n-2)-∑d[i] * (d[i]-1)/2
=n*(n-1)*(n-2)-∑(d[i]2+d[i])/2
=n*(n-1)*(n-2)-(1/2)*∑d[i]2 +m/2;
其中(n*(n-1)*(n-2)+m/2)皆为常数,不影响最大化(C(3,N)-∑C(2,d[i])),那么问题就转化成了最小化∑d[i]2 了。
这个平方应该怎么得到?标准做法非常NB,对于每条未定向边当做一个点,这个点向他的两个端点连边,而平方的费用怎么办?
拆边!对于一条容量为C的边,费用为flow2*k,那么我就把它拆为C条容量为一的边,费用分别为k,3*k,5*k......(2*c-1)k!
这道题貌似还要用到单位容量网络流做,等会在学把。
第二题:poi最少链覆盖
给你一个有向无环图,要求用最少的链覆盖所有的边。
做法是把图看成是一个网络流,要求每一条边流量下界为1的最小流。这个最小流怎么求呢?其实只要做一次上下界网络流再从汇点到源点反着做次网络流就可以了!