hdu 5556 Land of Farms 最大团+暴力
Land of Farms
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 539 Accepted Submission(s): 177
Farmer John wants to build as many farms as possible on the new land. It is required that any two farms should not be adjacent. Otherwise, sheep from different farms would fight on the border. This should be an easy task until several ancient farms are discovered.
Each of the ancient farms also consists of one or more connected grids. Due to the respect to the ancient farmers, Farmer John do not want to divide any ancient farm. If a grid from an ancient farm is selected in a new farm, other grids from the ancient farm should also be selected in the new farm. Note that the ancient farms may be adjacent, because ancient sheep do not fight each other.
The problem is a little complicated now. Can you help Farmer John to find a plan with the maximum number of farms?
Each test case starts with a line containing two integers N and M, indicating the size of the land. Each of the following N lines contains M characters, describing the map of the land (1≤N,M≤10). A grid of an ancient farm is indicated by a single digit (0-9). Grids with the same digit belong to the same ancient farm. Other grids are denoted with a single character “.”. It is guaranteed that all test cases are valid.
3 4
..3.
023.
.211
2 3
...
...
4 4
1111
1..1
1991
1111
Case #2: 3
Case #3: 1
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
#include <map>
#include <bitset>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <set>
#define MM(a,b) memset(a,b,sizeof(a));
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
#define CT continue
#define SC scanf char f[15][15];
int anc[16],flag[14],mp[12][12],cnta,ans,res;
int dx[]={0,0,1,-1},dy[]={1,-1,0,0},match[105],used[105];
vector<int> G[205];
int cas,r,l;
bitset<15> sta; void add_edge(int u,int v)
{
G[u].push_back(v);
G[v].push_back(u);
//if(sta==0) cout<<"u: "<<u<<" v:"<<v<<"\n";
} bool dfs(int u)
{
used[u]=1;
for(int i=0;i<G[u].size();i++){
int v=G[u][i],w=match[v];
if(w<0||(!used[w]&&dfs(w))){
match[u]=v;
match[v]=u;
return true;
}
}
return false;
} int bi_mactch()
{
int res=0;
MM(match,-1);
for(int i=1;i<=r;i++) for(int j=1;j<=l;j++){
int k=(i-1)*l+j;
if(match[k]<0){
MM(used,0);
if(dfs(k)) res++;
}
}
return res;
} int par[15]; int findr(int u)
{
if(par[u]!=u)
par[u]=findr(par[u]);
return par[u];
} void unite(int u,int v)
{
int ru=findr(u),rv=findr(v);
if(ru!=rv) par[ru]=rv;
} int num=0;
void sear(int i,int j)
{
if(f[i][j]>='0'&&f[i][j]<='9'){
int k=f[i][j]-'0';
if(!flag[k]) return;
mp[i][j]=-1;
for(int d=0;d<4;d++){
int tx=i+dx[d],ty=j+dy[d];
if(f[tx][ty]>='0'&&f[tx][ty]<='9'){
int k2=f[tx][ty]-'0';
if(flag[k2]) unite(k,k2);
}
else if(f[tx][ty]=='.') mp[tx][ty]=-1;
}
}
} void bgraph()
{
for(int i=1;i<=110;i++) G[i].clear();
for(int i=1;i<=r;i++)
for(int j=1;j<=l;j++)
if(f[i][j]=='.'&&!mp[i][j]){
num++;
int k=(i-1)*l+j;
//if(sta==0) cout<<"kk:"<<k<<"\n";
if(f[i-1][j]=='.'&&!mp[i-1][j]) add_edge(k,k-l);
if(f[i][j-1]=='.'&&!mp[i][j-1]) add_edge(k,k-1);
}
} void solve()
{
ans=0;
for(int k=0;k<=(1<<cnta)-1;k++){
res=0;MM(mp,0);MM(flag,0);
sta=k;
for(int i=0;i<cnta;i++) if(sta[i]) {
int w=anc[i+1];flag[w]=1;
par[w]=w;
}
for(int i=1;i<=r;i++) for(int j=1;j<=l;j++) sear(i,j);
for(int i=1;i<=cnta;i++)
if(flag[anc[i]]&&par[anc[i]]==anc[i]) res++;
num=0;bgraph();
ans=max(ans,res+num-bi_mactch());
}
} int main()
{
SC("%d",&cas);
int kk=0;
while(cas--){
SC("%d%d",&r,&l);
MM(flag,0);
cnta=0;
for(int i=1;i<=r;i++) {
SC("%s",f[i]+1);
for(int j=1;j<=l;j++)
if(f[i][j]!='.'){
int k=f[i][j]-'0';
if(!flag[k]){
flag[k]=1;
anc[++cnta]=k;
}
}
}
solve();
printf("Case #%d: %d\n",++kk,ans);
}
return 0;
}
分析:
1.先2^10=10^3暴力枚举选择的古代的田,选择了后,在用并查集维护一下,能产生的牧田数。
2.删除选择的古代的田周围的普通田地,再用下网格的二分图,考虑不想邻的连接一条边,那么最后显然成成了,求这样一个最大团
3.二分图的最大团=补图的最大点独立集合=顶点数-最大匹配数
hdu 5556 Land of Farms 最大团+暴力的更多相关文章
- 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.其中数字表示这是该格是古老的土地,字符'.'表示该格只是普通的土地. 可以认为一块古老的农田由四联通的所有数字相同的格组成的块,一块普通的 ...
- hdu 4740 The Donkey of Gui Zhou(暴力搜索)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4740 [题意]: 森林里有一只驴和一只老虎,驴和老虎互相从来都没有见过,各自自己走过的地方不能走第二次 ...
- hdu 3183 A Magic Lamp rmq或者暴力
A Magic Lamp Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Pro ...
- HDU 6395 Sequence 【矩阵快速幂 && 暴力】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6395 Sequence Time Limit: 4000/2000 MS (Java/Others) ...
- 「国庆训练&知识学习」图的最大独立集与拓展(Land of Farms,HDU-5556)
题意 一个\(N*M\)的矩阵,其中"."代表空地,"0-9"代表古代建筑,我们如果选择了一个编号的古代建筑想要建立,那么对应就要将全部该编号的建筑建立起来,如 ...
- HDU 4462:Scaring the Birds(暴力枚举+状态压缩)
http://acm.hdu.edu.cn/showproblem.php?pid=4462 题意:有一个n*n的地图,有k个空地可以放稻草人,给出每个空地可以放的稻草人属性,属性中有个R代表这个位置 ...
- HDU 6697 Closest Pair of Segments (计算几何 暴力)
2019 杭电多校 10 1007 题目链接:HDU 6697 比赛链接:2019 Multi-University Training Contest 10 Problem Description T ...
- HDU 3267 Graph Game(博弈论+图论+暴力)
题面传送门 题意: 有一棵 \(n\) 个节点的图 \(G\),R 和 B 两个人轮流操作,R 先操作. 每次操作 R 可以染红任意一条未染色的边,B 可以染蓝任意一条未染色的边 R 的目标是染成一棵 ...
随机推荐
- LeetCode 328——奇偶链表(JAVA)
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起.请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性. 请尝试使用原地算法完成.你的算法的空间复杂度应为 O(1),时 ...
- HTTP API自动化测试
重构:发现测试的价值 回到起点,测试要解决什么问题,为什么要做API自动化测试平台?做这个平台,不是为了满足老板的提倡全民自动化的口号,也不是为了浮夸的KPI,更不是宣传自动化可以解决一切问题,发现所 ...
- vue采坑之——vue里面渲染html 并添加样式
在工作中,有次遇到要把返回的字符串分割成两部分,一部分用另外的样式显示. 这时候,我想通过对得到字符串进行处理,在需要特别样式的字符串片段用html标签(用的span)包裹起来再通过变量绑定就好了.不 ...
- .js文件中文乱码解决办法
描述:.js文件里的中文内容在网页中显示乱码 解决办法:把JS文件的编码改为utf-8 VS2013解决步骤:文件——高级保存选项——Unicode (UTF-8带签名) 代码页 65001
- springboot内置tomcat配置虚拟路径
在Springboot中默认的静态资源路径有:classpath:/METAINF/resources/,classpath:/resources/,classpath:/static/,classp ...
- springboot 集成 dubbo(一)简介
一.简介 1,springboot 是 一款快速开发的框架,减少了开发人员对配置文件的操作.采用一些注解来取代xml配置文件. 注解包含预先封装的注解和开发人员自定义注解.同时使用Maven.Grad ...
- Div实现水平垂直居中
在实际应用中很多地方不仅要求实现元素的水平居中或者垂直居中效果,还可能会在水平方向和垂直方向上都要实现居中效果,下面就简单介绍几种元素水平垂直居中的方法(注:不同的方法会存在一些优缺点以及兼容性问题) ...
- swagger2注解使用方法
swagger注解整体说明: @Api:用在请求的类上,表示对类的说明 tags="说明该类的作用,可以在UI界面上看到的注解" value="该参数没什么意义,在UI界 ...
- identity server4获取token和userInfo
一.简介 IdentityServer4(ids4)是用于ASP.NET Core的OpenID Connect和OAuth 2.0框架.在许多成熟的.net core框架中都完美的集成的该身份服务框 ...
- 算法9-----输出全排列(递归)---移除K个数,剩下最小数。
1.题目:给定一个字符串,输出所有的字典序. 如: 输入字符串:'ac',输出:['ac','ca'] 输入字符串:‘abc' ,输出:['abc','acb','bac','bca','cab',' ...