bzoj1066 —— [SCOI2007]蜥蜴
2015-10-04 09:47
453 查看
http://www.lydsy.com/JudgeOnline/problem.php?id=1066
isap模板题
神tmwa了两次...
isap模板题
神tmwa了两次...
#include <queue> #include <cstdio> #include <cstring> using namespace std; queue<int>q; int dis[1000]; int gap[1000]; struct edge { int v,f,next; }e[100000]; int cnt = -1; int head[1000]; int a[25][25]; int r,c,d,n,en,ans,tot; int cal (int i,int j) { return (i - 1) * c + j; } void adde (int u,int v,int f) { e[++cnt].v = v; e[cnt].f = f; e[cnt].next = head[u]; head[u] = cnt; e[++cnt].v = u; e[cnt].f = 0; e[cnt].next = head[v]; head[v] = cnt; } void bfs () { gap[0] = 1; q.push(en); while(!q.empty()) { int u = q.front(); q.pop(); for(int i = head[u];i != -1;i = e[i].next) { int v = e[i].v; if(!e[i ^ 1].f) continue; if(dis[v]) continue; dis[v] = dis[u] + 1; ++gap[dis[v]]; q.push(v); } } } int dfs (int u,int minf) { if(u == en) return minf; int chan = en; int Left = minf; int res; for(int i = head[u];i != -1;i = e[i].next) { int v = e[i].v; if(e[i].f > 0 ) { if(dis[v] == dis[u] - 1) { res = dfs(v,min(Left,e[i].f)); e[i].f -= res; e[i ^ 1].f += res; Left -= res; if(dis[0] == 0x3f3f3f3f) return minf - Left; if(Left == 0) break; } if(dis[v]) chan = min(chan,dis[v]); } } if(Left == minf) { --gap[dis[u]]; if(gap[dis[u]] == 0) { dis[0] = 0x3f3f3f3f; return minf - Left; } dis[u] = chan + 1; ++gap[dis[u]]; } return minf - Left; } void isap () { bfs(); while(dis[0] < 0x3f3f3f3f) { ans += dfs(0,0x3f3f3f3f); } } int main () { memset(head,-1,sizeof head); scanf("%d%d%d",&r,&c,&d); n = r * c; en = 2 * n + 1; for(int i = 1;i <= r;++i) for(int j = 1;j <= c;++j) scanf("%1d",&a[i][j]); char C = getchar(); for(int i = 1;i <= r;++i) { for(int j = 1;j <= c;++j) { C = getchar(); if(C == 'L') { adde(0,cal(i,j),1); ++tot; } } C = getchar(); } for(int i = 1;i <= r;++i) { for(int j = 1;j <= c;++j) { if(a[i][j] == 0) continue; for(int k = 1;k <= r;++k) for(int l = 1;l <= c;++l) { if(i == k && j == l) continue; if((i - k) * (i - k) + (j - l) * (j - l) <= d * d) if(a[k][l] != 0) adde(cal(i,j) + n,cal(k,l),0x3f3f3f3f); } } } for(int i = 1;i <= r;++i) for(int j = 1;j <= c;++j) if(a[i][j]) adde(cal(i,j),cal(i,j) + n,a[i][j]); for(int i = 1;i <= r;++i) for(int j = 1;j <= c;++j) { if(a[i][j]) if(i <= d || j <= d || r - i < d || c - j < d) { adde(cal(i,j) + n,en,0x3f3f3f3f); } } isap(); printf("%d\n",tot - ans); }
相关文章推荐
- java笔试勘误
- 枚举类的理解和应用
- 15 个必须知道的 chrome 开发工具技巧
- Servlet 生命周期、工作原理
- C#调用Oracle存储过程
- POJ 3913 Gnome Sequencing(水~)
- codeforces 366C C. Dima and Salad(dp)
- mysql-5.5.46源码编译安装
- OS X升级到10.11后Xcode6.4界面无iOS device选择栏的解决办法
- OS X升级到10.11后Xcode6.4界面无iOS device选择栏的解决办法
- OS X升级到10.11后Xcode6.4界面无iOS device选择栏的解决办法
- 面试心得(BAT)
- 又见gcd(hdu-2504)
- 软工文档总结
- 【bzoj1260】【CQOI2007】【涂色paint】【dp】
- Android访问权限
- 设计模式—简单工厂模式
- 图片自动无限轮播
- cocos shader 之 马赛克滤镜
- Java获取当前时间