oj:https://gxyzoj.com/d/gxyznoi/p/P93
它要判断什么时候不漏水,就是需要建一种图,使得原图的最大流是答案
因为是网格图,考虑黑白染色,可以将\((i+j)\)对2取模的结果作为颜色,将所有颜色为1的点向源点连边,颜色为0的点向汇点连边
接下来考虑如何判断是否漏水,因为有四个方向,考虑拆点
将每个点拆为上下左右四个周围点和一个中间点,然后此时就可以将能流到的方向与其对应的点相连
接下来考虑旋转,虽然原图共有15种情况,实则可以分成5大类
- 只有一条出边
上图中的边朝上,所以向右或向左均需转一次,而向下需转两次,所以可以从上向左和有分别连一条边权为1的边,向下连一条边权为2的边
- 直线型
因为无法旋转,直接连边即可
- L型
显然,转一次可以使朝上的边向下或使朝右的边向左,所以可以从上向下,从右向左分别连一条边权为1的边
接着考虑旋转2次的情况,其实就是将两条边跑满,所以不用另外建边