这题主要有了中间的一些连通块的限制,不太好直接用二分图最大独立集做。考虑到图比较小,可以作补图求最大团来求解。

 #include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <cassert>
#include <sstream>
using namespace std; const int N=; char s[N][N];
int id[N][N];
int dx[]={,,,-};
int dy[]={,-,,};
int n,m; struct MC{
bool graph[N][N];
int stk[N][N],dp[N],mc;
int choice[N],vertex[N];
void dfs(int n,int sz,int dep){
if (sz==){
if (dep>mc){
mc=dep;
for (int i=;i<mc;i++)
vertex[i]=choice[i];
}
return;
}
for (int i=;i<sz;i++){
int u=stk[dep][i];
if (dep+dp[u]<=mc) return;
if (dep+sz-i<=mc) return;
choice[dep]=u;
int cnt=;
for (int j=i+;j<sz;j++){
int v=stk[dep][j];
if (graph[u][v])
stk[dep+][cnt++]=v;
}
dfs(n,cnt,dep+);
}
}
int maxClique(int n){
mc=;
//节点从1开始标号
dp[n]=;
for (int i=n-;i>=;i--){
int sz=;
for (int j=i+;j<=n;j++)
if (graph[i][j])
stk[][sz++]=j;
choice[]=i;
dfs(n,sz,);
dp[i]=mc;
}
return mc;
}
void solve(int &cas) {
map<char,int> mp;
int cnt=;
for (int i=;i<=n;i++) {
for (int j=;j<=m;j++) {
if (s[i][j]=='.')
id[i][j]=++cnt;
else if (mp.find(s[i][j])==mp.end())
id[i][j]=mp[s[i][j]]=++cnt;
else
id[i][j]=mp[s[i][j]];
}
}
//for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) cout<<id[i][j]<<" ";cout<<endl;
for (int i=;i<=cnt;i++) {
for (int j=;j<=cnt;j++) {
if (i==j) graph[i][j]=false;
graph[i][j]=true;
}
}
for (int i=;i<=n;i++) {
for (int j=;j<=m;j++) {
int u=id[i][j];
for (int k=;k<;k++) {
int ni=i+dx[k];
int nj=j+dy[k];
if (ni<=||nj<=||ni>n||nj>m) continue;
int v=id[ni][nj];
graph[u][v]=false;
graph[v][u]=false;
}
}
}
printf("Case #%d: %d\n",cas,maxClique(cnt));
}
}mc; int main () {
//freopen("out.txt","r",stdin);
int T;
scanf("%d",&T);
while (T--) {
scanf("%d %d",&n,&m);
for (int i=;i<=n;i++) {
scanf("%s",s[i]+);
}
static int cas=;
mc.solve(cas);
cas++;
}
return ;
}

HDU 5556 最大独立集的更多相关文章

  1. hdu 3289 最大独立集

    题意:一个动物园里有N只猫和K只狗,一些小朋友来参观,他们如果喜欢狗就不喜欢猫,喜欢猫就不喜欢狗,园长想要移走一些动物,如果,移走的是某个小朋友不喜欢的,而喜欢的没被移走,该小朋友就会高兴,求移动的数 ...

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

  3. hdu 1068(最大独立集)

    Girls and Boys Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

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

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

  5. HDU 1068 Girls and Boys (二分图最大独立集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068 有n个同学,格式ni:(m) n1 n2 n3表示同学ni有缘与n1,n2,n3成为情侣,求集合 ...

  6. HDU 1068 Girls and Boys(最大独立集合 = 顶点数 - 最大匹配数)

    HDU 1068 :题目链接 题意:一些男孩和女孩,给出一些人物关系,然后问能找到最多有多少个人都互不认识. 转换一下:就是大家都不认识的人,即最大独立集合 #include <iostream ...

  7. HDU 1068 Girls and Boys(最大独立集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068 题目大意:有n个人,一些人认识另外一些人,选取一个集合,使得集合里的每个人都互相不认识,求该集合 ...

  8. HDU 3829——Cat VS Dog——————【最大独立集】

    Cat VS Dog Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit S ...

  9. hdu - 1068 Girls and Boys (二分图最大独立集+拆点)

    http://acm.hdu.edu.cn/showproblem.php?pid=1068 因为没有指定性别,所以要拆点,把i拆分i和i’ 那么U=V-M (M是最大匹配,U最大独立集,V是顶点数) ...

随机推荐

  1. lucene倒排索引缓冲池的细节

    倒排索引要存哪些信息   提到倒排索引,第一感觉是词到文档列表的映射,实际上,倒排索引需要存储的信息不止词和文档列表.为了使用余弦相似度计算搜索词和文档的相似度,需要计算文档中每个词的TF-IDF值, ...

  2. jQuery测验题

    1.在div元素中,包含了一个<span>元素,通过has选择器获取<div>元素中的<span>元素的语法是? 提示使用has() $("div:has ...

  3. JAVA基础:求一个数组的中心元素

  4. 基于 Koa平台Node.js开发的KoaHub.js的控制器,模型,帮助方法自动加载

    koahub-loader koahub-loader是基于 Koa平台Node.js开发的KoaHub.js的koahub-loader控制器,模型,帮助方法自动加载 koahub loader I ...

  5. Sersync实时同步

    sersync会对目录进行监控,将变化的目录或文件同步到远程服务器.sersync是递归监控的,如果有多级目录 ,都会同步到远程服务器. sersync依赖于rsync进行同步,在同步主服务器上开启s ...

  6. javascript中parseint和number的区别

    本来是不想写这个的,网上也有,问题是讲得很不清楚,或者说我阅读能力差吧. 首先,解释一下定义的区别: parseInt将字符串(String)类型转为整数类型.Number() 函数把对象(Objec ...

  7. [TPYBoard - Micropython之会python就能做硬件 8] 学习使用蓝牙模块及舵机

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604   一.实验器材 1.TPYboard V102板  一块 2.电机驱动模块L2 ...

  8. Fibonacci数列前n项值的输出(运用递归算法)

    1.斐波那契数列: 又称黄金分割数列,指的是这样一个数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 在数学上,斐波纳契数列以如下被以递归的方法 ...

  9. windows下的python flask环境搭建

    在Windows中搭建flask框架分为如下几步 1. 下载ez_setup.py文件,然后在cmd中执行 链接:http://pan.baidu.com/s/1qXOSeHu 密码:jkbw pyt ...

  10. Android 7.0(牛轧糖)新特性

    Android 7.0(牛轧糖)新特性 谷歌正式在I/O大会现场详细介绍了有关Android 7.0的大量信息.目前,我们已经知道,新一代Android操作系统将支持无缝升级,能够通过Vulkan A ...