每个点(i,j),(i,j)→(i,j)'连上容量为h[i][j]的边。(i,j)为入点。(i,j)'为出点
对于所有有蜥蜴的点,从S给它连一条容量为1的边。对于所有可以跳到外面的点,连到T,容量是h[i][j]。
网络流跑一遍
const int N = 30; struct Point { int Ox, Oy, H; Point() {} Point(int _Ox, int _Oy, int _H) : Ox(_Ox), Oy(_Oy), H(_H) {} } Dat[sqr(N)], Start[sqr(N)]; struct Edge { int V, Val; Edge *Next, *Pair; Edge() {} Edge(int _V, int _Val, Edge *_Next) : V(_V), Val(_Val), Next(_Next) {} } *Fir[sqr(N) << 1]; int n, m, Dis, Tot, Sum; int H[sqr(N) << 1], Gap[sqr(N) << 1], S, T; char Str[N]; inline void Input() { scanf("%d%d%d", &n, &m, &Dis), getchar(); Tot = Sum = 0; For(i, 1, n) { scanf("%s", Str + 1), getchar(); For(j, 1, m) if(Str[j] != '0') Dat[++Tot] = Point(i, j, Str[j] - '0'); } For(i, 1, n) { scanf("%s", Str + 1), getchar(); For(j, 1, m) if(Str[j] == 'L') Start[++Sum] = Point(i, j, 0); } } #define Num(x, y) (((x) - 1) * (m) + (y)) #define In(x) (x) #define Out(x) ((x) + ((n) * (m))) inline void insert(int u, int v, int c) { Fir[u] = new Edge(v, c, Fir[u]), Fir[v] = new Edge(u, 0, Fir[v]); Fir[u]->Pair = Fir[v], Fir[v]->Pair = Fir[u]; } inline int Sap(int u, int last) { int MinH = T, use = last, v; if(u == T) return last; for(Edge *Tab = Fir[u]; Tab != NULL; Tab = Tab->Next) if(Tab->Val > 0) { if(H[u] == H[v = Tab->V] + 1) { int flow = Sap(v, min(use, Tab->Val)); Tab->Val -= flow, Tab->Pair->Val += flow, use -= flow; if(H[S] >= T) return last - use; if(!use) break; } MinH = min(MinH, H[v]); } if(use == last) { if(!(--Gap[H[u]])) H[S] = T; Gap[H[u] = MinH + 1]++; } return last - use; } inline void Solve() { // Build For(i, 1, Tot) { int u = Num(Dat[i].Ox, Dat[i].Oy), v; For(j, i + 1, Tot) if(sqr(Dat[i].Ox - Dat[j].Ox) + sqr(Dat[i].Oy - Dat[j].Oy) <= sqr(Dis)) { v = Num(Dat[j].Ox, Dat[j].Oy); insert(Out(u), In(v), INF), insert(Out(v), In(u), INF); } insert(In(u), Out(u), Dat[i].H); } S = ((n * m) << 1) + 1; T = S + 1; For(i, 1, Sum) insert(S, In(Num(Start[i].Ox, Start[i].Oy)), 1); For(i, 1, Tot) if(Dat[i].Ox <= Dis || Dat[i].Oy <= Dis) insert(Out(Num(Dat[i].Ox, Dat[i].Oy)), T, INF); // Sap int Ans = 0; for(Gap[0] = T; H[S] < T;) Ans += Sap(S, INF); printf("%d\n", Sum - Ans); } int main() { #ifndef ONLINE_JUDGE SETIO("1066"); #endif Input(); Solve(); return 0; }
相关推荐
八中OJ,又简作BZOJ,以原题巨多而著称,该数据为BZOJ上的1000-1109和1130-1139的测试数据节点,没有题目,有需要题目的可以到https://hydro.ac/d/bzoj/p网站查找对应的题目。
BZOJ原题-BZOJP1000-P2000的题目,下载后可以离线做题。
本模板为 BZOJ3224:文艺平衡树 的源程序 含各种操作,旋转,插入,删除,求前驱,后继,查询值为x的数的排名,查询排名为k的数,求最大值,最小值……
「BZOJ1053」反素数/「Violet5」樱花 详细题解
bzoj部分数据.
BZOJ原题-BZOJP3001-P4000的题目,下载后可以离线做题。
BZOJ3230相似子串的测试数据,希望能够帮到大家。
BZOJ网站镜像,对于经常挂掉的BZOJ真是刷题必备啊!
BZOJ平台全部代码,解压到一个文件夹在打开使用。BZOJ平台全部代码,解压到一个文件夹在打开使用。
BZOJ原题-BZOJP2001-P3000的题目,下载后可以离线做题。
BZOJ原题-BZOJP4001-P4406的题目,下载后可以离线做题。
bzoj1878数据(莫队)详细题解:http://blog.csdn.net/boyxiejunboy/article/details/50611972
BZOJ省选十连测题面,只有题面!!!!!,请自行到BZOJ上进行提交,上传目的是提供离线的一个题目
题解 , 文档 , 资料 BZOJ 泡泡堂
ZOJCH是BZOJ题库的离线版
#BZOJ Problem Rankrank.cpp 程序文件data.dat bzoj题库数据done.dat AC过的题,初始可以把所有A过的题粘进去,正常退出的话自动维护。black.dat 黑名单。选题时会跳过。错题、神题、没题面、不想做等等。//Thank ...
CreationAugust 的BZOJ代码合集 【Written by CreationAugust】
八中OJ所有题目
CTSC 2011 无穷图的桥(BZOJ 2307) 题解.ppt
bzoj FFT 的模版