我对于题目的一种理解
改造农场
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的更多相关文章

  1. HDU5556 Land of Farms(二分图 2015 合肥区域赛)

    容易想到将问题转化为求图的独立数问题 ,但求一般图的独立集是一个NPC问题,需要一些转化. 状态压缩,枚举每个上古农场是否选择,然后将剩下的新农场根据i + j奇偶性分为x , y集. 结果为 max ...

  2. hdu 5556 Land of Farms 最大团+暴力

    Land of Farms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  3. 「国庆训练&知识学习」图的最大独立集与拓展(Land of Farms,HDU-5556)

    题意 一个\(N*M\)的矩阵,其中"."代表空地,"0-9"代表古代建筑,我们如果选择了一个编号的古代建筑想要建立,那么对应就要将全部该编号的建筑建立起来,如 ...

  4. 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 ...

  5. 【HDOJ5556】Land of Farms(最大团)

    题意:给定n*m的网格图,上面只有字符'.' 和 数字0-9.其中数字表示这是该格是古老的土地,字符'.'表示该格只是普通的土地. 可以认为一块古老的农田由四联通的所有数字相同的格组成的块,一块普通的 ...

  6. Application Request Route实现IIS Server Farms集群负载详解

    序言 随着公司业务的发展,后台业务就变的越来越多,然而服务器的故障又像月经一样,时不时的汹涌而至,让我们防不胜防.那么后台的高可用,以及服务器的处理能力就要做一个横向扩展的方案,以使后台业务持续的稳定 ...

  7. POJ 1365 Prime Land(数论)

    题目链接: 传送门 Prime Land Time Limit: 1000MS     Memory Limit: 10000K Description Everybody in the Prime ...

  8. [2015hdu多校联赛补题]hdu5378 Leader in Tree Land

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5378 题意:给你一棵n个结点的有根树.因为是有根树,那么每个结点可以指定以它为根的子树(后面讨论的子树 ...

  9. UVALive 7261 Xiongnu's Land (扫描线)

    Wei Qing (died 106 BC) was a military general of the Western Han dynasty whose campaigns against the ...

随机推荐

  1. 济南清北学堂游记 Day 4.

    不知不觉,行程已经过半了啊. 基本上已经熟悉了这里的环境,这其实也意味着我应该很快就要走了. 明天和后天还有最后四场模拟赛,虽然以我的实力拿不到奖,但我也会尽力做好我自己. 我大概反思了一下这几天,其 ...

  2. bzoj 4822: [Cqoi2017]老C的任务

    4822: [Cqoi2017]老C的任务 练手速... #include <iostream> #include <cstdio> #include <cstring& ...

  3. [测试]java IO写入文件效率——几种方法比较

    各类写入方法 /** *1 按字节写入 FileOutputStream * * @param count 写入循环次数 * @param str 写入字符串 */ public void outpu ...

  4. ORM规约变更经典案例---mysql军规

    先介绍一下<MySQL数据库开发的三十六条军规>,这里只介绍核心的,具体内容大家可以自行百度,这是从底层开发人员到管理者必须知道规范.出自58赶集. 写在前面的话: 总是在灾难发生后,才想 ...

  5. SQL Server 文件操作

    在master数据库中,SQL Server提供系统扩展的存储过程,其中有一些存储过程的命名以xp_开头,用于处理操作系统的文件. 一,判断文件是否存在 存储过程sys.xp_fileexist 用于 ...

  6. 一个客户端一键安装环境和服务的shell脚本

    #!/bin/bash basepath=$(cd `dirname $0`; pwd)SHELL_DIR="${basepath}/shell"PACKAGE_DIR=" ...

  7. 在linux内核中修改TCP MSS值

    MTU: Maxitum Transmission Unit 最大传输单元 MSS: Maxitum Segment Size 最大分段大小 MSS最大传输大小的缩写,是TCP协议里面的一个概念.MS ...

  8. Mybatis使用总结-思维导图

    目前使用到Mybatis的总结,缓存还未涉及:

  9. explorer.exe 该文件没有与之关联的程序来执行该操作

    删了点右键的东西搞出来的问题 其实就是关联出错了,解决:(新建一个temp.reg,内容如下,然后双击导入注册表即可) Windows Registry Editor Version 5.00 [[H ...

  10. Android Native App自动化测试实战讲解(上)(基于python)

    1.Native App自动化测试及Appuim框架介绍 android平台提供了一个基于java语言的测试框架uiautomator,它一个测试的Java库,包含了创建UI测试的各种API和执行自动 ...