http://poj.org/problem?id=3020

题意:

一个矩形中,有N个城市'*',现在这n个城市都要覆盖无线,若放置一个基站,它至多可以覆盖相邻的两个城市。
问至少放置多少个基站才能使得所有的城市都覆盖无线?

无向二分图的最小路径覆盖 = 顶点数 – 最大二分匹配数/2

 #include <stdio.h>
#include <string.h>
const int N=;
int pos[N][N],map[N][N];
int link[N];
bool vis[N];
int dir[][] = {{,-},{,},{,},{-,}};
int n;
int dfs(int x)
{
for (int i = ; i <= n; i++)
{
if (map[x][i]&&!vis[i])
{
vis[i] = true;
if(!link[i]||dfs(link[i]))
{
link[i] = x;
return ;
}
}
}
return ;
}
int main()
{
char ch;
int t,h,w;
scanf("%d",&t);
while(t--)
{
int id = ;
int ans = ;
scanf("%d%d%*c",&h,&w);
memset(pos,,sizeof(pos));
memset(map,,sizeof(map));
memset(link,,sizeof(link));
for(int i = ; i <= h; i++)
{
for (int j = ; j <= w; j++)
{
scanf("%c",&ch);
if (ch=='*')
pos[i][j] = ++id;
}
getchar();
}
for (int i = ; i <= h; i++)
{
for (int j = ; j <= w; j++)
{
if(pos[i][j])
for (int k = ; k < ; k++)
{
int dx = i+dir[k][];
int dy = j+dir[k][];
if(pos[dx][dy])
{
map[pos[i][j]][pos[dx][dy]] = ;
}
}
}
}
n = id;
for (int i = ; i <= n; i++)
{
memset(vis,,sizeof(vis));
if(dfs(i))
ans++;
}
printf("%d\n",n-ans/);//无向二分图的最小路径覆盖 = 顶点数 – 最大二分匹配数/2
}
return ;
}

最新文章

  1. 前端制作动画的几种方式(css3,js)
  2. 编译器开发系列--Ocelot语言7.中间代码
  3. read links July-14
  4. Object类概述
  5. REST风格URL
  6. 九幽2015年Q3 WP市场份额细分报告
  7. 转化率最高的16个WordPress 电子商务主题
  8. Caffe Ubuntu14.04 64位 的最快安装 (cuda7.5 + cudnn7.0 2016最新)
  9. MQTT控制---pingreq
  10. PLSQL:orecal,tnsname简介
  11. 安卓入门——————简单记账本的开发(二)-点击listview跳转并实现数据的更新
  12. Java编程的逻辑 (92) - 函数式数据处理 (上)
  13. (4.8)mysql备份还原——binlog查看工具之show binlog的使用
  14. python爬虫——跟踪登录过程以及意外的发现(4)
  15. Shell基础知识(二)
  16. Linux系统下面crontab选择默认编译器
  17. Python中模块的发布与安装
  18. 浅谈cocos2dx(18) 中工厂模式
  19. c++ 文件共享打开
  20. 8、String练习题

热门文章

  1. TWaver 3D应用于大型数据中心(续)
  2. xmpp 消息和好友上下线(3)
  3. Iframe用法精析
  4. 超星toPDF
  5. POJ 3468 线段树区间修改查询(Java,c++实现)
  6. mysql function 查询子级机构
  7. CodeForcesGym 100753F Divisions
  8. Keywords Search AC自动机
  9. 项目中应用到的框架和技术之二——ol3-ext
  10. C#中方法的详解