无限之环
无限之环
题解
最开始看上去像道模拟,不过看到数据范围就知道不可能了。好吧,正解是网络流,接下来讲一下网络流怎么打这一道题。
我们知道,对于每一个格子的每一个管子,它一定会与附近的一个格子的一个管子相连,这是毋庸置疑的。我们必须要让每个管子都流满否则必定会漏水。
我们发现,整个图最后一定会变成若干个独立的联通块,我们可以将每个格子都连向源点或者汇点,至于怎么连可以通过黑白染色的方法来判断。
对于产生的费用这个最重要的花费,我们可以通过旋转与拆点来表示。一个格子需要拆成五个点,分别代表上下左右中。旋转边的花费我们只需要在内部依次向中心连花费为1的边即可。
不过对于每种不同情况的格子我们都需要分别讨论一下,有点麻烦。
这题主要是情况有点多,都需要特判一下,没其他的了。
源码
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define MAXN 400005
#define MAXM 20005
using namespace std;
#define UP(x) x+turn*n*m
#define RI(x) x+((turn+1)&3)*n*m
#define DO(x) x+((turn+2)&3)*n*m
#define LE(x) x+((turn+3)&3)*n*m
#define MD(x) x&

浙公网安备 33010602011771号