[BZOJ 1066] 蜥蜴
来源:互联网 发布:定义一个变量sql 编辑:程序博客网 时间:2024/05/16 01:22
</pre>网络流拆点 非常基础的题 把柱子拆成两个点 再加入超级源点和超级汇点即可</p><p><span style="font-size:24px"></span><pre name="code" class="cpp">#include<cstdio>#include<algorithm>#include<cstring>#include<queue>#include<cmath>#define MAXN 20#define MAXM 20const int INF = 0x3f3f3f3f;using namespace std;int ID, id[MAXN+10][MAXN+10];char Map[MAXN+10][MAXN+10], XX[MAXN+10][MAXN+10];int n, m, S, T, k;template <int maxn, int maxm>struct Isap{ int ecnt; int d[maxn+10], pre[maxn+10], cur[maxn+10], gap[maxn+10]; int adj[maxn+10]; struct node { int v, next, c, f; }Edge[maxm*2+10]; void init() { memset(adj, -1, sizeof(adj)); ecnt = 0; } void addedge(int u, int v, int c) { Edge[ecnt].v = v; Edge[ecnt].c = c; Edge[ecnt].f = 0; Edge[ecnt].next = adj[u]; adj[u] = ecnt++; } void add(int u, int v, int c) { addedge(u, v, c); addedge(v, u, 0); } void init_dis(int t) { queue <int> q; memset(d, -1, sizeof(d)); memset(gap, 0, sizeof(gap)); d[t] = 0; q.push(t); while(!q.empty()) { int u = q.front(); q.pop(); gap[d[u]]++; for(int i = adj[u]; ~i; i = Edge[i].next) { int v = Edge[i].v; if(d[v] == -1) { d[v] = d[u] + 1; q.push(v); } } } } int ISAP(int s, int t, int num) { init_dis(t); int ans = 0, u = s; int Flow = INF; memcpy(cur, adj, sizeof(adj)); while(d[s] < num) { int &i = cur[u]; for(; ~i; i = Edge[i].next) { int v = Edge[i].v; if(Edge[i].c > Edge[i].f && d[u] == d[v] + 1) { u = v; pre[v] = i; Flow = min(Flow, Edge[i].c - Edge[i].f); if(u == t) { while(u != s) { int j = pre[u]; Edge[j].f += Flow; Edge[j^1].f -= Flow; u = Edge[j^1].v; } ans += Flow; Flow = INF; } break; } } if(i == -1) { if(--gap[d[u]] == 0) break; int dmin = num - 1; cur[u] = adj[u]; for(int j = adj[u]; ~j; j = Edge[j].next) if(Edge[j].c > Edge[j].f) dmin = min(dmin, d[Edge[j].v]); d[u] = dmin+1; gap[d[u]]++; if(u != s) u = Edge[pre[u]^1].v; } } return ans; }}; Isap <MAXN*MAXN*4+10, MAXN*MAXN*MAXN*MAXN*2+10> sap;int cnt;double dis(int x1, int y1, int x2, int y2){ return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));}int main(){ sap.init(); scanf("%d%d%d", &n, &m, &k); for(int i = 1; i <= n; i++) scanf("%s", Map[i]+1); for(int i = 1; i <= n; i++) scanf("%s", XX[i]+1); S = 2 * n * m + 1; T = 2 * n * m + 2; for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) { id[i][j] = ++ID; if(XX[i][j] == 'L') { sap.add(S, id[i][j], 1); cnt++; } if(Map[i][j] == '0') continue; if(Map[i][j] > '0') sap.add(id[i][j], n*m+id[i][j], Map[i][j] - '0');for(int ii = 1; ii <= n; ii++) for(int jj = 1; jj <= m; jj++) if(Map[ii][jj] > '0' && dis(i, j, ii, jj) <= k && !(ii == i && jj == j)){sap.add(n*m+id[i][j], id[ii][jj], INF);sap.add(n*m+id[ii][jj], id[i][j], INF);} if(i <= k || n - k < i || j <= k || m - k < j) sap.add(n*m+id[i][j], T, INF); } int ans = sap.ISAP(S, T, n*m*2+2); printf("%d", cnt - ans);}
0 0
- [BZOJ 1066][SCOI2007]蜥蜴
- BZOJ 1066: [SCOI2007]蜥蜴
- bzoj 1066: [SCOI2007]蜥蜴
- [BZOJ 1066] 蜥蜴
- bzoj 1066: [SCOI2007]蜥蜴
- 蜥蜴[SCOI2007,BZOJ 1066]
- BZOJ 1066 [SCOI2007]蜥蜴
- BZOJ 1066, 蜥蜴
- bzoj 1066蜥蜴
- [bzoj 1066][SCOI2007]蜥蜴
- bzoj 1066 [SCOI2007] 蜥蜴 题解
- bzoj 1066 蜥蜴(最大流)
- bzoj 1066 蜥蜴 最大流
- 【最大流】[SCOI2007]蜥蜴 BZOJ 1066
- BZOJ 1066 SCOI 2007 蜥蜴 最大流
- BZOJ 1066 POJ 2711 [SCOI2007]蜥蜴
- BZOJ 1066 POJ 2711 [SCOI2007]蜥蜴
- BZOJ 1066: [SCOI2007]蜥蜴 网络最大流
- Python语言入门级使用(一)
- C语言中运用“非”判断一个整数是否能被5整除
- window下ANSI转UTF-8,UTF-8转Unicode的实现
- 苹果WWDC2014大会最新技术分析
- 软件1班人品计算器1.0作业
- [BZOJ 1066] 蜥蜴
- 深入剖析tomcat 第二章
- 002北京的空气好闷
- [BZOJ 1588]营业额统计 && splay部分模版
- 第五章 树和二叉树
- DLL与LIB库文件的生成和使用---C++
- 杭电_人见人爱A^B
- json转换为数组
- Windows Server2003添加超级终端组件的方法【组图】