bzoj2150
2016-03-30 08:03
316 查看
水水水。。
裸最小路径覆盖。。
我为何这么水。
裸最小路径覆盖。。
我为何这么水。
#include <cstdio> #include <cstring> using namespace std; int dx[5],dy[5]; int n,m,r,c,sz; bool a[55][55]; struct edge { int v,next; }e[10010]; int cnt,head[5010]; int Linkx[5010],Linky[5010]; bool vis[5010]; int read_int () { char c = getchar(); int re = 0; for(;c > '9' || c < '0';c = getchar()); for(;c >= '0' && c <= '9';c = getchar()) re = re * 10 + c - '0'; return re; } void adde (int u,int v) { e[cnt].v = v; e[cnt].next = head[u]; head[u] = cnt++; } int cal (int x,int y) { return (x - 1) * m + y; } int dfs (int u) { for(int i = head[u];i != -1;i = e[i].next) { int v = e[i].v; if(vis[v]) continue; vis[v] = 1; if(!Linky[v] || dfs(Linky[v])) { Linkx[u] = v; Linky[v] = u; return 1; } } return 0; } int main () { memset(head,-1,sizeof head); n = read_int(); m = read_int(); r = read_int(); c = read_int(); sz = n * m; dx[1] = -r; dy[1] = -c; dx[2] = -c; dy[2] = -r; dx[3] = -r; dy[3] = c; dx[4] = -c; dy[4] = r; for(int i = 1;i <= n;++i) { for(int j = 1;j <= m;++j) { if(getchar() == '.') { a[i][j] = 1; for(int k = 1;k <= 4;++k) { int x = i + dx[k]; int y = j + dy[k]; if(x >= 1 && x <= n && y >= 1 && y <= m && a[x][y]) adde(cal(x,y),cal(i,j) + n * m); } } else sz--; } getchar(); } int ans = 0; for(int i = 1;i <= n * m;++i) { if(!Linkx[i]) { memset(vis,0,sizeof vis); ans += dfs(i); } } printf("%d\n",sz - ans); }
相关文章推荐
- 简短程序推断大小端
- 转载Sql 获取数据库所有表及其字段名称,类型,长度
- 面向对象
- Content Provider内容提供者
- BZOJ 2462: [BeiJing2011]矩阵模板
- BZOJ 1500[NOI2005] 维修数列
- 2016年3月28日作业
- Service如何工作?
- LFCS 系列第三讲:归档/压缩文件及目录、设置文件属性和搜索文件
- 白话经典算法系列之一 冒泡排序的三种实现
- bzoj 2588 Spoj 10628. Count on a tree
- 【poj 1837】Balance 题意&题解&代码(C++)
- Try using /USELOCALTIME
- 【BZOJ-1208】宠物收养所 Splay
- 广播接收器的生命周期及使用
- bzoj 3289: Mato的文件管理
- 公司的高速发展是对团队最好的管理
- 平衡树模板&&bzoj 3223&&Tyvj 1729 文艺平衡树
- 无法打开键: UNKNOWN\Components\BE1FB738077DBE490AF18C3B9B1A1EE8\E5F5286B58B542741A00A0A9AA420B27
- 【BZOJ3048】Cow lineup,贪心+队列维护(或二分答案)