题解:在一个n*m的棋盘上,有一些标志,问最少用多少个1*2的矩形可以把它们全部套住。 
可以将每一个标志与其相邻的四个标志建一条边,这样就形成了一个无向图,题目的意思即要求最小的边数。使得所有的点都在这些边数。
这样就转换成了最小路径覆盖问题。
最小路径覆盖=顶点数-最大二分匹配
本题是无向图,即二分图中的边是双向边,若1和2匹配的话,那么2和1也匹配,
所以本题=顶点数-最大二分匹配/2
 1 #include<iostream> 2 using namespace std; 3 const int Row=45; 4 const int Line=15; 5 char str[Row][Line];  6 bool cover[Row][Line];  7 char dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1} ;  8 int h,w,cnt;  9 struct Link10 {11 int x,y;    12 }link[Row][Line];13 bool find (int py, int px)  14 {  15     int i, j ;  16     int x, y ;  17     for (i = 0 ; i < 4 ; ++i)  18     {  19         y = py + dir[i][0] ;  20         x = px + dir[i][1] ;  21         if ((0<x && x <=w && 0<y && y<=h) && !cover[y][x] && (str[y][x]=='*'))   22         {  23             cover[y][x] = true ;  24             if (!link[y][x].x || find (link[y][x].y, link[y][x].x))  25             {  26                 link[y][x].y = py ;  27                 link[y][x].x = px ;  28                 return 1 ;   29             }  30         }  31     }  32     return 0 ;  33 } 34     35 36 37 int mach()38 {39     int sum=0;40     for (int j = 1 ; j <=h ; ++j)  41     for (int i = 1 ; i <=w ; ++i)  42     {  43         if (str[j][i] == '*')  44         {  45             ++cnt ;  46             memset (cover, false, sizeof (cover)) ;  47             sum += find (j, i) ;  48         }  49     } 50 return cnt-sum/2;    51 }52 53 int main()54 {55     int k;56     scanf("%d",&k);    57     58     while(k--)59     {60         cnt=0;61         scanf("%d %d",&h,&w);62         memset(link,0,sizeof(link));63         for(int i=1;i<=h;i++)64         {65             scanf("%s",&str[i][1]);66         }67         printf("%d\n",mach());68     }69         70     return 0;    71 }

 1 #include<iostream> 2 using namespace std; 3 const int Row=45; 4 const int Line=15; 5 char str[Row][Line];  6 bool cover[Row][Line];  7 char dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1} ;  8 int h,w,cnt;  9 struct Link10 {11 int x,y;    12 }link[Row][Line];13 bool find (int py, int px)  14 {  15     int i, j ;  16     int x, y ;  17     for (i = 0 ; i < 4 ; ++i)  18     {  19         y = py + dir[i][0] ;  20         x = px + dir[i][1] ;  21         if ((0<x && x <=w && 0<y && y<=h) && !cover[y][x] && (str[y][x]=='*'))   22         {  23             cover[y][x] = true ;  24             if (!link[y][x].x || find (link[y][x].y, link[y][x].x))  25             {  26                 link[y][x].y = py ;  27                 link[y][x].x = px ;  28                 return 1 ;   29             }  30         }  31     }  32     return 0 ;  33 } 34     35 36 37 int mach()38 {39     int sum=0;40     for (int j = 1 ; j <=h ; ++j)  41     for (int i = 1 ; i <=w ; ++i)  42     {  43         if (str[j][i] == '*')  44         {  45             ++cnt ;  46             memset (cover, false, sizeof (cover)) ;  47             sum += find (j, i) ;  48         }  49     } 50 return cnt-sum/2;    51 }52 53 int main()54 {55     int k;56     scanf("%d",&k);    57     58     while(k--)59     {60         cnt=0;61         scanf("%d %d",&h,&w);62         memset(link,0,sizeof(link));63         for(int i=1;i<=h;i++)64         {65             scanf("%s",&str[i][1]);66         }67         printf("%d\n",mach());68     }69         70     return 0;    71 }

第二种解法将在近期公布。

转载于:https://www.cnblogs.com/tiankonguse/archive/2012/03/17/2403068.html

pku3020 Antenna Placement (解法1)相关推荐

  1. 二分图最大匹配(匈牙利算法) POJ 3020 Antenna Placement

    题目传送门 1 /* 2 题意:*的点占据后能顺带占据四个方向的一个*,问最少要占据多少个 3 匈牙利算法:按坐标奇偶性把*分为两个集合,那么除了匹配的其中一方是顺带占据外,其他都要占据 4 */ 5 ...

  2. 【POJ - 3020】Antenna Placement (匈牙利算法,二分图最小边覆盖)

    题干: The Global Aerial Research Centre has been allotted the task of building the fifth generation of ...

  3. Antenna Placement

    题目描述: The Global Aerial Research Centre has been allotted the task of building the fifth generation ...

  4. (匹配 二维建图) Antenna Placement --POJ --3020

    链接: http://poj.org/problem?id=3020 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82834#probl ...

  5. pku 3020 Antenna Placement

    http://poj.org/problem?id=3020 求最小路径覆盖问题 ,对于有向图最小路径覆盖 = 一边的点数 (x集或y集)- 最大匹配 无向图最小路径覆盖 = 一边的点数 (x集或y集 ...

  6. poj 3020 Antenna Placement(二分图最大匹配)

    题意: N行M列的矩阵,每个格子里不是 * 就是 O . * :是一个利益点. O:是一个空白点. 每次可以用一个圈覆盖相邻的两个*.(左右相邻或上下相邻). 问最少需要多少个圈可以覆盖所有的*. 思 ...

  7. POJ - 3020 Antenna Placement(最小路径覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一个n*m的地图,图中'o'代表空地,'*'代表城市,现在需要给城市装无线网,每个无线网最多可以覆盖相邻的两个城市,问覆盖所有的城市最少需要装多少个无线网 题目分析: ...

  8. POJ 3020 Antenna Placement

    解题思路:求解最大独立集,转而求解最小顶点覆盖->最大流问题 #include <iostream> using namespace std; int t; int father[4 ...

  9. NC107617 poj3020 Antenna Placement

    问题: n * m的矩阵,有一些障碍点,用12的骨牌覆盖所有非障碍点 (12骨牌可重叠,骨牌可越界,骨牌可延伸到障碍点) 问最少需要 多少个. 题解: • 尽量用一个骨牌覆盖两个格子,覆盖不了了再重叠 ...

最新文章

  1. 如何用DELPHI区分彩色图和黑白图(多色与单色)??
  2. 计算机网络【wireshark抓包分析】
  3. 第六十二节,html分组元素
  4. 大数据_Hbase-(知识点回顾)---Hbase工作笔记0010
  5. Object-C使用NSLog打印日志
  6. 从零开始学 Web 之 CSS(三)链接伪类、背景、行高、盒子模型、浮动
  7. 图解DbgView使用
  8. ## Manjaro的一站式安装流程(以kde版本为例)
  9. 干货|关于云计算认证升级内容
  10. 阿里内核月报2014年7月-8月
  11. 计算机网络hdcp是什么意思,韩立平:笔记本电脑上hdcp是干什么的?
  12. 只有单号,用这个方法自动识别快递公司,快速查询出物流
  13. 苹果搜索广告ASA开户教程
  14. 性能优化之mysql优化_性能优化之MySQL优化
  15. css中div的意思是什么
  16. Arduino与人体感应模块
  17. C语言程序设计(11.28)
  18. SAP CRM BOL collection find_by_property
  19. Windows安装VirtualBox教程(图文版)
  20. 软交换总结之五-GPRS相关:PCU与RPP的经典之作

热门文章

  1. QT中显示gif图片方法
  2. Ubuntu之镜像iso安装系统
  3. 为博客园博文添加目录的两种方法
  4. layer.js 使用
  5. POJ C程序设计进阶 编程题#3:运算符判定
  6. 压缩流--DeflateStream和GZipStream
  7. [转]深入理解 __doPostBack
  8. 第三届全国县域经济基本竞争力百强县(市)
  9. webview检测html事件,在JavaFX WebView中检测HTML textarea onkeyup事件
  10. springcloud 整合 gateway_GitHub上最火的SpringCloud微服务商城系统项目,附全套教程