【HDOJ5556】Land of Farms(最大团)
题意:给定n*m的网格图,上面只有字符'.' 和 数字0-9。其中数字表示这是该格是古老的土地,字符'.'表示该格只是普通的土地。
可以认为一块古老的农田由四联通的所有数字相同的格组成的块,一块普通的农田只由一格组成。
现在要建立最大数目的农田,要求任意两块农田不能相邻。问你能够建立的最大数目。
n,m<=10
思路:把四联通的同一个数字缩成一个,每个字符.当做单独的一个,按照相邻四联通情况建图
这样建出来的图不一定是二分图,变成了一个一般图最大独立集问题
考虑一般图最大独立集=建反图后最大团大小,使用爆搜版本的最大团求解,随机化的最大团正确性在此题范围下没有保证,甚至连样例有时都过不去……
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<ctime>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair
#define N 210000
#define M 130
#define MOD 1000000007
#define eps 1e-8
#define pi acos(-1) const int dx[]={-,,,};
const int dy[]={,,-,}; char ch[M];
int num[M][M],a[M][M],set[M][M],f[M][M],g[M],p[M],ans; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} bool dfs(int size,int dep)
{
if(!size)
{
if(dep>ans)
{
ans=dep;
return ;
}
else return ;
}
for(int i=;i<=size;i++)
{
if(dep+size-i+<=ans) return ;
int u=set[dep][i];
if(dep+g[u]<=ans) return ;
int num=;
for(int j=i+;j<=size;j++)
if(f[u][set[dep][j]]) set[dep+][++num]=set[dep][j];
if(dfs(num,dep+)) return ;
}
return ;
} int main()
{
freopen("E.in","r",stdin);
freopen("E.out","w",stdout);
int cas,n,m,size,id;
scanf("%d",&cas);
for(int v=;v<=cas;v++)
{
scanf("%d%d",&n,&m);
for(int i=;i<=;i++) p[i]=;
id=;
for(int i=;i<=n;i++)
{
scanf("%s",ch+);
for(int j=;j<=m;j++)
{
if(''<=ch[j]&&ch[j]<='')
{
if(!p[ch[j]-'']) p[ch[j]-'']=++id;
num[i][j]=p[ch[j]-''];
}
else num[i][j]=++id;
}
} for(int i=;i<=id;i++)
for(int j=;j<=id;j++) f[i][j]=i!=j; for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
for(int k=;k<=;k++)
{
int x=i+dx[k];
int y=j+dy[k];
if(x<||x>n||y<||y>m) continue;
f[num[i][j]][num[x][y]]=;
f[num[x][y]][num[i][j]]=;
}
} ans=;
for(int i=id;i>;i--)
{
size=;
for(int j=i+;j<=id;j++)
if(f[i][j]) set[][++size]=j;
dfs(size,);
g[i]=ans;
}
printf("Case #%d: %d\n",v,ans);
}
return ;
}
【HDOJ5556】Land of Farms(最大团)的更多相关文章
- 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 二分图匹配
Farmer John and his brothers have found a new land. They are so excited and decide to build new farm ...
- 「国庆训练&知识学习」图的最大独立集与拓展(Land of Farms,HDU-5556)
题意 一个\(N*M\)的矩阵,其中"."代表空地,"0-9"代表古代建筑,我们如果选择了一个编号的古代建筑想要建立,那么对应就要将全部该编号的建筑建立起来,如 ...
- HDU5556 Land of Farms(二分图 2015 合肥区域赛)
容易想到将问题转化为求图的独立数问题 ,但求一般图的独立集是一个NPC问题,需要一些转化. 状态压缩,枚举每个上古农场是否选择,然后将剩下的新农场根据i + j奇偶性分为x , y集. 结果为 max ...
- hdu5556 Land of Farms
我对于题目的一种理解 改造农场 1.建新农场 在空的点选 2.重建旧农场 选一个点属于这个农场的地方都要选 最后的农场都不能相连 所以枚举旧农场的个数并进行二分图匹配 #include<bits ...
- Note -「最大团-最小度不等式」
这是什么奇怪的名字qwq. 一些定义 只为便于理解,没有苛求专业的定义. 简单无向图:不存在重边.自环的无向图. \(\delta(G)\):无向图 \(G\) 中结点的最小度数.即 \(\m ...
- Application Request Route实现IIS Server Farms集群负载详解
序言 随着公司业务的发展,后台业务就变的越来越多,然而服务器的故障又像月经一样,时不时的汹涌而至,让我们防不胜防.那么后台的高可用,以及服务器的处理能力就要做一个横向扩展的方案,以使后台业务持续的稳定 ...
- 代码的坏味道(5)——数据泥团(Data Clumps)
坏味道--数据泥团(Data Clumps) 特征 有时,代码的不同部分包含相同的变量组(例如用于连接到数据库的参数).这些绑在一起出现的数据应该拥有自己的对象. 问题原因 通常,数据泥团的出现时因为 ...
- 软件海贼团 OnePiece (版权所有)
最近迷上了“海贼王”这部动画片,不仅仅是因为其中的人物个个性格鲜明,剧情跌宕起伏扣人心弦,各种耍宝搞笑,还感觉到这个团队很像理想中的敏捷软件团队. 作为一直带团队的我,感觉“海贼王”这个动画片给了我很 ...
随机推荐
- git bash学习3 -简单杂乱知识点记录
branch 新建分支 git init git add git commit 先新建一个仓库以及master 然后新建分支 git branch BranchName 然后切换分支 git chec ...
- 【TP】TP如何向模板中的js传变量
<input type="hidden" class= "val" value = "{$value}" /> <scri ...
- python练手习题
不断记录python常见习题,不断寻求更多更好的解决办法.持续更新中..... 练习: 1. list两两元素交换位置,如[1,2,3,4,5,6] 执行后为 -> [2,1,4,3,6,5] ...
- [Hdu1693]Eat the Trees(插头DP)
Description 题意:在n*m(1<=N, M<=11 )的矩阵中,有些格子有树,没有树的格子不能到达,找一条或多条回路,吃完所有的树,求有多少种方法. Solution 插头DP ...
- Python 信号处理 signal 模块
Table of Contents 1. signal模块简介 1.1. signal简单示例 1.2. signal说明 1.2.1. 基本的信号名 1.2.2. 常用信号处理函数 2. signa ...
- JVM——Java类加载机制总结
)解析:解析阶段是把虚拟机中常量池的符号引用替换为直接引用的过程. 2.3 初始化 类初始化时类加载的最后一步,前面除了加载阶段用户可以通过自定义类加载器参与以外,其余都是虚拟机主导和控制.到了初始化 ...
- 关于RelativeLayout设置垂直居中对齐不起作用的问题
直接上代码 1.原有代码:(红色字体部分不起作用,无法让RelativeLayout中的textview居中) <RelativeLayout Android:id="@+id/aut ...
- MySQL之索引(二)
高性能的索引策略 正确地创建和使用索引是实现高性能查询的基础.在MySQL之索引(一)这一章中我们介绍了各种类型的索引及其对应的优缺点.现在我们一起来看看如何真正地发挥这些索引的优势. 独立的列 我们 ...
- Fragment 和 Activity 之间通信
在 Activity 中获取 Fragment 实例: FragmentManager 提供了一个类似于 findViewById 的方法,专门用于从布局文件中获取 Fragment 实例: //通过 ...
- oracle常用关键字和函数
数据库的增删改查: 增:insert into ... values(); 例:insert into p_emp values(sq_emp.nextval,,sysdate,,null,,); c ...