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 ...
随机推荐
- POJ 3537 Crosses and Crosses [Multi-SG]
传送门 我也不知道为什么枚举vis必须加上一个边界才能A 以后还是都加上吧 #include <iostream> #include <cstdio> #include < ...
- iOS学习——布局利器Masonry框架源码深度剖析
iOS开发过程中很大一部分内容就是界面布局和跳转,iOS的布局方式也经历了 显式坐标定位方式 --> autoresizingMask --> iOS 6.0推出的自动布局(Auto La ...
- 对.Net Core结合Docker和Jexus的实践
本文基于上次尝试之后的进一步尝试,加入Docker容器.编写Dockerfile,并且jexus结合Docker的使用,总结下自己的个人感想. 一.环境介绍 当前的场景有两种方式将Demo实现运行,一 ...
- Linux系统下LNMP一键搭建Linux、PHP、MySQL环境(适合新手搭建linux下的web生成环境)
一. 首先要解释一下,什么是LNMP,LNMP起源于LAMP,LAMP是Linux+Apache+Mysql/MariaDB+Perl/PHP/Python的缩写,这里将Web服务端的Apache替换 ...
- SqlSugar ORM 入门到精通【一】入门篇
背景 SqlSugar是一款国产ORM,除了拥有媲美原生的性能 另外还有满足各种需求的功能,简单好用一分钟就能够轻松上手. 2.x版本正式在自已公司内部项目使用 3.x版本得到了更多公司的喜欢不过也会 ...
- Asp.Net Core 2.0 之旅---在Ubuntu上部署WEB应用程序
1.Ubuntu 上 安装NET Core 2.0 SDK 第一步的安装,微软大佬已经写的非常详细了=>直达链接,按照教程来即可. 2.将我们的WEB 发布到一个文件夹,将这个文件夹打包成 压缩 ...
- python配置apache的web服务器方法(python的CGI配置)
先大概介绍一下:Python CGI编程 什么是CGI CGI 目前由NCSA维护,NCSA定义CGI如下: CGI(Common Gateway Interface),通用网关接口,它是一段程序,运 ...
- python学习:调用其他函数
vim wc.py #!/usr/bin/python def wordCount(s): chars = len(s) words = len(s.split()) ...
- 微信小程序内嵌网页 网站生成小程序
1. 进入小程序后台 - 设置 - 开发设置 2. 添加业务域名(小程序只支持https) 3. 小程序代码 <web-view src="网址"></web-v ...
- DML、DDL、DCL的区别
DML(data manipulation language): 它们是SELECT.UPDATE.INSERT.DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言DDL( ...