网络流相关

Prog0.
n 个点,m 条边的有向图。
你可以花费 ai 将点 i 的所有入边删除,或者花费 bi 将点 i 的所有出边删除。
问删去所有边的最小花费。
n, m <= 1000.
题解:
我们考虑最小割,即我们如果能用割的方法维护一下连通性就好了。于是把一个点拆成两个点,对应着的那些点进行连边。
左边的点i和右边的点i’,我们S - >i表示i删掉了它的出边。
i’ - >T表示i删掉了它的入边。
这样的话,考虑这个图的割,每个割都意味着删掉这些边之后,S集和T集不再联通。
也就是说……
S集和T集不再联通意味着什么啊?
嗯我陷入了思考……你让我冷静一下……

考虑一个显然的事实:
S - > T联通,意味着存在某两个点i - > j的边还没有”删掉”。
我们考虑一条边i - > j,那么要么删i的出边,要么删j的入边,否则就是不合法的。
嗯……现在通过i - > j使得S - > T有边,你只有割掉一条边才能让它合法,要么割掉S - > i(即选择 ai ),要么割掉j - >T(即选择 bj ),否则割掉inf。
有最大流等于最小割,所以我们只要跑一遍最大流就好啦。
//自己什么时候这么弱了……

Prog1.
n 行 m 列的地图。有些格子上有障碍。
每次操作,你可以花费 ai 的代价消去第 i 行的所有障碍,也可以花费 bi 的代价消去第 i 列的所有障碍(对任意的 i)。
问在操作次数最少的前提下的最少花费是多少。

1 <= n, m, ai, bi <= 100.
题解:注意到,我们的代价的权值非常小。
那么我们考虑每次的代价都+100000,这样的话我们跑最小割就应该很愉快了。
等等……你说不会建图……
你知道邻接矩阵吗?
把每个障碍看作是i - > j的一条边,删掉一行或者列的话……
卧槽这不是上一题吗?
呃……
这题就解决了。
Prog2.
n 个点的树。给每条边染色。
可以染的颜色是 1 ~ n,染颜色 i 的代价是 i。
要求同一个点相连的所有边的颜色不能相同。
问最小的染色代价之和。

n <= 150.

啊你说这个……

f[i][j]表示以i为根的子树选j的价值。
你说什么?这是DP?
这是DP啊。
然后f[i][j] = min{/sum f[儿子][k]}
对于每一个儿子k,考虑它的所有可能的颜色。
嗯……建立一张二分图。
左边是儿子们,右边是颜色们。
儿子 - > 颜色 = > f[son][col]
求最小权完备匹配。
KM算法。

完美谢幕。

你可能感兴趣的:(网络流相关)