一道建图题……

// by SiriusRen
#include <cstdio>
#include <cstring>
using namespace std;
#define N 1666
int h,w,v[N],next[N],first[N],tot,cnt,cases,map[55][55],fa[N],ans;
char a[55][55],xx[]={1,-1,0,0},yy[]={0,0,1,-1},vis[N];
void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
bool dfs(int x){
for(int i=first[x];~i;i=next[i])
if(!vis[v[i]]){
vis[v[i]]=1;
if(!fa[v[i]]||dfs(fa[v[i]]))
{fa[v[i]]=x;return 1;}
}
return 0;
}
int main(){
scanf("%d",&cases);
while(cases--){
tot=0;cnt=ans=0;memset(map,0,sizeof(map));
memset(first,-1,sizeof(first)),memset(fa,0,sizeof(fa));
scanf("%d%d",&h,&w);
for(int i=1;i<=h;i++)
for(int j=0;j<=w;j++){
scanf("%c",&a[i][j]);
if(a[i][j]=='*')map[i][j]=++cnt;
else map[i][j]=0;
}
for(int i=1;i<=h;i++)
for(int j=1;j<=w;j++)
if(map[i][j])
for(int k=0;k<4;k++)
if(map[i+xx[k]][j+yy[k]])
add(map[i][j],map[i+xx[k]][j+yy[k]]);
for(int i=1;i<=cnt;i++,memset(vis,0,sizeof(vis)))
if(dfs(i))ans++;
printf("%d\n",cnt-ans/2);
}
}

最新文章

  1. Android开发学习——应用安装过程
  2. SpringMVC学习总结(三)——Controller接口详解(1)
  3. Problem A+B
  4. 简明的例子讲解position:relative、float、overflow:hidden和inline-block
  5. strlen与sizeof有什么区别?
  6. 请不要在广州.NET俱乐部群里谈郑智话题,谢谢!
  7. 【洛谷P1516】青蛙的约会
  8. CentOS 7系统上添加netcdf库
  9. 算法之Python实现 - 002 : 换钱的最少货币数补充(每种货币只能使用一次)
  10. (转)你应该知道的RPC原理
  11. WPF窗体的生命周期
  12. vue-自定义全局键盘码
  13. Mac下android studio卡,居然这么解决了。。。。
  14. 2018.11.30 bzoj3230: 相似子串(后缀数组)
  15. win10 无法打开 APICloud Studio 2 的解决方案
  16. 菜鸟学Java(二十一)——如何更好的进行单元测试——JUnit
  17. Thunder——Final发布
  18. Linux系统下 Apache+PHP 环境安装搭建
  19. SpringData_PagingAndSortingRepository接口
  20. ffmpeg源码分析--av_find_best_stream &lt;转&gt;

热门文章

  1. javascript中构造函数的三种方式
  2. android黑科技系列——手机端破解神器MT的内购VIP功能破解教程
  3. WPF自定义动画控件 风机
  4. 05--C语言运算符优先级和ASCII码表
  5. Kattis - Game Rank
  6. 07 Django组件-中间件
  7. day22 包,相对/绝对路径
  8. Kaggle竞赛顶尖选手经验汇总
  9. css 垂直居中方法总结
  10. linux双网卡配置