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 ...
随机推荐
- Kakfa消息投递语义
Message Delivery Semantics At most once -- Messages may be lost but are never redelivered(消息可能丢失但不会重 ...
- NIO内存映射
磁盘的IO因为速度较慢,可能成为系统运行的瓶颈.所以磁盘的IO在操作系统级实现了提前读,延迟写的机制来提升IO的性能. 提前读就是一次读取需求的数据的同时多读接下来的一段数据至OS缓冲区中,延迟写就是 ...
- XSD详解三 - 复合元素+总结篇
一.复合元素介绍 1.什么是复合元素? 复合元素指包含其他元素及/或属性的 XML 元素. 有四种类型的复合元素: 空元素 包含其他元素的元素 仅包含文本的元素 包含元素和文本的元素 注释:上述元素均 ...
- Mybatis使用总结-思维导图
目前使用到Mybatis的总结,缓存还未涉及:
- CodeForces 820C
题意略. 这道题目的出题者竟然被hack了!? 我的思路是:在游戏开始时,为了尽量少地用字母,我应该尽量选取计算机输出的前a个字母中已经使用过的字母.但是为了使电脑也尽量少用字母,我添加的这b个字母应 ...
- 利用Azure嵌套虚拟化,解决公有云上机器不能启动的问题
很多时候我们都会碰到因为意外重启,机器硬盘被损坏导致无法启动,或者是因为各种原因Windows上的RDP服务启动不了,Linux上的SSH无法链接等等问题.碰到这种问题基本上很难解决以前都是将VHD下 ...
- Linux定时任务深入学习
为当前用户创建cron服务 1. 键入 crontab -e 编辑crontab服务文件 例如 文件内容如下: */2 * * * * /bin/sh /home/admin/jiaoben/bu ...
- DOCKER 无法获取使用宿主机DNS 的原因,解决方法
今天在公司服务器上部署项目,遇到一个大坑.接口怎么请求都不同,宿主机DNS已经改了.宿主可以请求,找了半天,原来是DOCKER 没有获取到主机的DNS 进去DOCKER解析不了域名 指定DNS 启动也 ...
- Unix代码段和数据段
关于UNIX系统代码段和数据段分开的目的:方便编程. 1)代码段:代码段是用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存中的镜像.代码段需要防止在运行时被非法修改,所以只准许读取操作,而 ...
- struts2标签库----数据标签详解
上篇文章我们介绍struts2标签库中的控制标签的基本使用和部分原理,本篇文章接着了解下标签库中有关数据标签的使用和原理.主要涉及以下数据标签: action标签:用于在视图页面跳转到一个Action ...