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

 #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. Ubuntu 不支持 rpm

    不是第一次犯这个错误了. 记一下. 每次安装jdk 的时候,习惯性下载rpm包. 然后的,然后在 ubuntu上rpm 安装的时候就跪了.. ubuntu需要使用Alien 把rpm 转成 deb再安 ...

  2. linux计算程序运行时间

    转自: http://www.cnblogs.com/NeilHappy/archive/2012/12/08/2808417.html #include <sys/time.h> int ...

  3. mysql命令[转]

    来自:http://www.cnblogs.com/zhangzhu/archive/2013/07/04/3172486.html 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录my ...

  4. mysql数据库开启慢查询日志

    修改配置文件 在配置文件my.ini中加上下面两句话 log-slow-queries = C:\xampp\mysql_slow_query.log long_query_time=3 第一句使用来 ...

  5. 3.WP8.1开发_为控件增加动画

    示例: 把一个按钮的宽度从100变到500 根据WPF的经验,会把代码写成如下: <Grid> <Button x:Name="btn" Content=&quo ...

  6. iOS开发之UIPickerView

    1.使用方法 UIPickerView使用和UITableView大致类似.首先设置ViewController为数据源,然后遵守数据源协议< UIPickerViewDataRecouce&g ...

  7. Grunt usemin

    yeoman/grunt-usemin 用来将 HTML 文件中(或者 templates/views)中没有优化的 script 和 stylesheets 替换为优化过的版本. usemin 暴露 ...

  8. pyhton中的Queue(队列)

    什么是队列? 队列就像是水管子,先进先出,与之相对应的是栈,后进先出. 队列是线程安全的,队列自身有机制可以实现:在同一时刻只有一个线程在对队列进行操作. 存数据,取数据 import Queue q ...

  9. Spring的IoC容器

    Spring是一个轻量级的Java开发框架,其提供的两大基础功能为IoC和AOP,其中IoC为依赖反转(Inversion of Control).IOC容器的基本理念就是"为别人服务&qu ...

  10. Dapper源码学习和源码修改(下篇)

    目录: Dapper源码学习和源码修改(上篇主要讲解入参解析) Dapper源码学习和源码修改(下篇主要讲解出参解析) 继上篇讲了下自己学习Dapper的心得之后,下篇也随之而来,上篇主要讲的入参解析 ...