hdu5556 Land of Farms
我对于题目的一种理解
改造农场
1.建新农场 在空的点选
2.重建旧农场 选一个点属于这个农场的地方都要选
最后的农场都不能相连
所以枚举旧农场的个数并进行二分图匹配
#include<bits/stdc++.h>
using namespace std;
int N,M;
char mp[12][12];
vector<pair<int,int> > farm[12];
int has[12];
int dir[5][5] = { {1,0}, {0,1}, {-1,0}, {0,-1} };
int vis[12][12];
int ok(int x,int y) {
if(x >= 1 && x <= N && y >= 1 && y <= M) return 1;
else return 0;
}
int judge(int x, int y, int ty) {
for(int i = 0; i < 4; ++i) {
int t1 = x + dir[i][0]; int t2 = y + dir[i][1];
if( ok(t1,t2) && mp[t1][t2] != '.' && mp[t1][t2] != ty+'0' && has[mp[t1][t2] - '0'] ) return 0;
else if( ok(t1,t2) && mp[t1][t2] == '.' ) vis[t1][t2] = 1;
}
return 1;
}
int linker[12][12];
int used[12][12];
int dfs(int x, int y) {
if( (x+y)%2 == 1 ) return 0;
// printf("%d %d\n",x,y);
for(int i = 0; i < 4; ++i) {
int t1 = x + dir[i][0]; int t2 = y + dir[i][1];
if( ok(t1,t2) && !used[t1][t2] && !vis[t1][t2]) {
used[t1][t2] = 1;
if( linker[t1][t2] == -1 || dfs(linker[t1][t2]/11, linker[t1][t2]%11) ) {
linker[t1][t2] = x*11+y;
return 1;
}
}
}
return 0;
}
int ccc = 0;
int main(){
int T; scanf("%d",&T); int ca = 0;
while(T--) {
ccc = 0;
scanf("%d %d",&N,&M);
int ans = -1;
for(int i = 0; i <= 10; ++i) farm[i].clear();
for(int i = 1; i <= N; ++i) scanf("%s",mp[i]+1);
for(int i = 1; i <= N; ++i) {
for(int j = 1; j <= M; ++j) {
if(mp[i][j] != '.') {
farm[mp[i][j] - '0'].push_back({i,j});
}
}
}
for(int i = 0; i < (1<<10); ++i) {
int cc = 0;
memset(has,0,sizeof(has));
for(int j = 0; j < 10; ++j) {
if( (i& (1<<j)) && (int)farm[j].size() ) {
has[j] ++; cc ++;
}
}
if(!cc && i!=0) continue;
memset(vis,0,sizeof(vis));
int fl = 1;
for(int j = 0; j < 10 && fl; ++j) {
if(has[j]) {
for(int k = 0; k < (int)farm[j].size() && fl; ++k) {
fl = judge(farm[j][k].first, farm[j][k].second, j);
}
}
}
if(!fl) continue;
int tot = cc;
for(int j = 1; j <= N; ++j)
for(int k = 1; k <= M; ++k) {
if(mp[j][k] != '.') {
vis[j][k] = 1;
}else if(!vis[j][k]) tot ++;
}
/*
if(ccc < 10) {
for(int j = 0; j < 10; ++j) if(has[j]) printf("%d ",j); printf("\n");
for(int j = 1; j <= N; ++j) {
for(int k = 1; k <= M; ++k) {
printf("%d ",vis[j][k]);
}
printf("\n");
}
ccc ++;
}
*/
int res = 0;
memset(linker, -1, sizeof(linker));
for(int j = 1; j <= N; ++j) {
for(int k = 1; k <= M; ++k) {
if(vis[j][k]) continue;
memset(used,0,sizeof(used));
if(dfs(j,k)) res ++;
}
}
ans = max(tot - res, ans);
}
printf("Case #%d: %d\n", ++ca,ans);
}
return 0;
}
hdu5556 Land of Farms的更多相关文章
- HDU5556 Land of Farms(二分图 2015 合肥区域赛)
容易想到将问题转化为求图的独立数问题 ,但求一般图的独立集是一个NPC问题,需要一些转化. 状态压缩,枚举每个上古农场是否选择,然后将剩下的新农场根据i + j奇偶性分为x , y集. 结果为 max ...
- hdu 5556 Land of Farms 最大团+暴力
Land of Farms Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- 「国庆训练&知识学习」图的最大独立集与拓展(Land of Farms,HDU-5556)
题意 一个\(N*M\)的矩阵,其中"."代表空地,"0-9"代表古代建筑,我们如果选择了一个编号的古代建筑想要建立,那么对应就要将全部该编号的建筑建立起来,如 ...
- Land of Farms HDU - 5556 二分图匹配
Farmer John and his brothers have found a new land. They are so excited and decide to build new farm ...
- 【HDOJ5556】Land of Farms(最大团)
题意:给定n*m的网格图,上面只有字符'.' 和 数字0-9.其中数字表示这是该格是古老的土地,字符'.'表示该格只是普通的土地. 可以认为一块古老的农田由四联通的所有数字相同的格组成的块,一块普通的 ...
- Application Request Route实现IIS Server Farms集群负载详解
序言 随着公司业务的发展,后台业务就变的越来越多,然而服务器的故障又像月经一样,时不时的汹涌而至,让我们防不胜防.那么后台的高可用,以及服务器的处理能力就要做一个横向扩展的方案,以使后台业务持续的稳定 ...
- POJ 1365 Prime Land(数论)
题目链接: 传送门 Prime Land Time Limit: 1000MS Memory Limit: 10000K Description Everybody in the Prime ...
- [2015hdu多校联赛补题]hdu5378 Leader in Tree Land
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5378 题意:给你一棵n个结点的有根树.因为是有根树,那么每个结点可以指定以它为根的子树(后面讨论的子树 ...
- UVALive 7261 Xiongnu's Land (扫描线)
Wei Qing (died 106 BC) was a military general of the Western Han dynasty whose campaigns against the ...
随机推荐
- elk5.4小白踩坑记录
搭建请参考:http://www.ywnds.com/?p=9776 搭建步骤:http://www.ywnds.com/?p=9776 初步解方案:先不用管这个提示,当你创建完索引后,接受数据后.一 ...
- BZOJ 3309: DZY Loves Math [莫比乌斯反演 线性筛]
题意:\(f(n)\)为n的质因子分解中的最大幂指数,求\(\sum_{i=1}^n \sum_{j=1}^m f(gcd(i,j))\) 套路推♂倒 \[ \sum_{D=1}^n \sum_{d| ...
- 文件读写io操作范例
系统io读写,copy int main(int argc, char **argv) { if(argc != 3) { printf("Usage: %s <src> ...
- jquary 单选,多选,select 获取和设置值 jquary自定义函数
<%@ page contentType="text/html; charset=UTF-8"%> <%@ taglib prefix="c" ...
- hdfs文件按修改时间下载
应用于:对于不同用户创建的表目录,进行文件的下载,程序中执行hadoop cat命令 下载文件到本地,随后通过ftp传至目标服务器,并将hdfs文件目录的修改时间存入mysql中.每次修改前将mysq ...
- ConcurrentHashMap源码分析(一)
本篇博客的目录: 前言 一:ConcurrentHashMap简介 二:ConcurrentHashMap的内部实现 三:总结 前言:HashMap很多人都熟悉吧,它是我们平时编程中高频率出现的一种集 ...
- python[error] - mysql_config not found
具体报错信息: root@pts/4 $ pip install MySQL-python Collecting MySQL-python Using cached MySQL-python-1.2. ...
- python学习:99乘法口诀
#!/usr/bin/python for i in xrange(1,10): for j in xrange(1,i+1): print "%s*%s=%s& ...
- 广告等第三方应用嵌入到web页面方案 之 使用js片段
在自己的项目中嵌入过广告的朋友们可能都用过百度联盟, 只需要嵌入如下一段js代码片段, 就可以在自己的项目中嵌入广告, 来获得收益. <script type="text javasc ...
- xBIM WeXplorer 设置模型颜色
目录 基础 xBIM WeXplorer 简要介绍 xBIM WeXplorer xViewer 基本应用 xBIM WeXplorer xViewer 浏览器检查 xBIM WeXplorer xV ...