题意:一个N*M的矩阵里有K个观测点,你必须放置天线覆盖所有观测点。每个雷达只能天线两个观测点,这两点必须相邻。计算最少天线数。

做法:将所有相邻的观测点连起来,建图。跑一遍匈牙利算法就计算出了最大的覆盖数,除以二就是天线数。还要加上落单的观测点,每个都需要一个天线。

  1. /*--------------------------------------------------------------------------------------*/
  2. // Helica's header
  3. // Second Edition
  4. // 2015.11.7
  5. //
  6. #include <algorithm>
  7. #include <iostream>
  8. #include <cstring>
  9. #include <ctype.h>
  10. #include <cstdlib>
  11. #include <cstdio>
  12. #include <vector>
  13. #include <string>
  14. #include <queue>
  15. #include <stack>
  16. #include <cmath>
  17. #include <set>
  18. #include <map>
  19.  
  20. //debug function for a N*M array
  21. #define debug_map(N,M,G) printf("\n");for(int i=0;i<(N);i++)\
  22. {for(int j=;j<(M);j++){\
  23. printf("%d",G[i][j]);}printf("\n");}
  24. //debug function for int,float,double,etc.
  25. #define debug_var(X) cout<<#X"="<<X<<endl;
  26. /*--------------------------------------------------------------------------------------*/
  27. using namespace std;
  28.  
  29. const int maxn = ;
  30. int N,M,T;
  31. int G[*maxn][*maxn],Map[maxn][maxn];
  32. int dx[]={,-,,},dy[]={,,,-};
  33. int linker[*maxn];
  34. bool used[*maxn];
  35. int uN,vN;
  36.  
  37. bool dfs(int u)
  38. {
  39. for(int v=;v<=vN;v++)
  40. {
  41. if(G[u][v] && !used[v])
  42. {
  43. used[v] = true;
  44. if(linker[v] == - || dfs(linker[v]))
  45. {
  46. linker[v] = u;
  47. return true;
  48. }
  49. }
  50. }
  51. return false;
  52. }
  53.  
  54. int hungary()
  55. {
  56. memset(linker,-,sizeof linker);
  57. int res = ;
  58. for(int u=;u<=uN;u++)
  59. {
  60. memset(used,false,sizeof used);
  61. if(dfs(u)) res++;
  62. }
  63. return res;
  64. }
  65.  
  66. int main()
  67. {
  68. scanf("%d",&T);
  69. while(T--)
  70. {
  71. scanf("%d%d",&N,&M);
  72. char c;
  73. uN = ;
  74. for(int i=;i<N;i++)
  75. {
  76. getchar();
  77. for(int j=;j<M;j++)
  78. {
  79. scanf("%c",&c);
  80. if(c == '*') Map[i][j] = ++uN;
  81. else Map[i][j] = ;
  82. }
  83. }
  84. memset(G,,sizeof G);
  85. vN = uN;
  86. for(int i=;i<N;i++)
  87. {
  88. for(int j=;j<M;j++) if(Map[i][j])
  89. {
  90. int u = Map[i][j];
  91. for(int p=;p<;p++)
  92. {
  93. int nx = i+dx[p],ny = j+dy[p];
  94. if(nx >= && nx < N && ny >= && ny < M)
  95. {
  96. if(int v = Map[nx][ny])
  97. {
  98. //printf("u:%d v:%d\n",u,v);
  99. G[u][v] = G[v][u] = ;
  100. }
  101. }
  102. }
  103. }
  104. }
  105.  
  106. int ans = hungary();
  107. //printf("ans:%d uN:%d\n",ans,uN);
  108. printf("%d\n",(uN-ans)+ans/);
  109. }
  110. }

POJ 3020 -Antenna Placement-二分图匹配的更多相关文章

  1. POJ - 3020  Antenna Placement 二分图最大匹配

    http://poj.org/problem?id=3020 首先注意到,答案的最大值是'*'的个数,也就是相当于我每用一次那个技能,我只套一个'*',是等价的. 所以,每结合一对**,则可以减少一次 ...

  2. [POJ] 3020 Antenna Placement(二分图最大匹配)

    题目地址:http://poj.org/problem?id=3020 输入一个字符矩阵,'*'可行,'o'不可行.因为一个点可以和上下左右四个方向的一个可行点组成一个集合,所以对图进行黑白染色(每个 ...

  3. POJ 3020 Antenna Placement(二分图 匈牙利算法)

    题目网址:  http://poj.org/problem?id=3020 题意: 用椭圆形去覆盖给出所有环(即图上的小圆点),有两种类型的椭圆形,左右朝向和上下朝向的,一个椭圆形最多可以覆盖相邻的两 ...

  4. POJ 3020 Antenna Placement (二分图最小路径覆盖)

    <题目链接> 题目大意:一个矩形中,有N个城市’*’,现在这n个城市都要覆盖无线,每放置一个基站,至多可以覆盖相邻的两个城市.问至少放置多少个基站才能使得所有的城市都覆盖无线? 解题分析: ...

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

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

  6. poj 3020 Antenna Placement(最小路径覆盖 + 构图)

    http://poj.org/problem?id=3020 Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Sub ...

  7. POJ 3020 Antenna Placement 【最小边覆盖】

    传送门:http://poj.org/problem?id=3020 Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total ...

  8. 【POJ 3020】Antenna Placement(二分图匹配)

    相当于用1*2的板覆盖给定的h*w的格子里的点,求最少的板.可以把格子相邻的分成两个集合,如下图,0为一个集合,1的为一个,也就是(行数+列数)为奇数的是一个集合,为偶数的为另一个集合.1010101 ...

  9. POJ 3020 Antenna Placement【二分匹配——最小路径覆盖】

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

  10. POJ 3020 Antenna Placement 最大匹配

    Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6445   Accepted: 3182 ...

随机推荐

  1. 【C#复习总结】细说 Lambda表达式

    1 前言 本系列会将[委托] [匿名方法][Lambda表达式] [泛型委托] [表达式树] [事件]等基础知识总结一下.(本人小白一枚,有错误的地方希望大佬指正) 系类1:细说委托 系类2:细说匿名 ...

  2. [书籍]用UWP复习《C#并发编程经典实例》

    1. 简介 C#并发编程经典实例 是一本关于使用C#进行并发编程的入门参考书,使用"问题-解决方案-讨论"的模式讲解了以下这些概念: 面向异步编程的async和await 使用TP ...

  3. socketserver + ftp

    --------------------------------------------生活不止眼前的苟且,还有诗和远方的田野. day 29 socketserver + ftp # # ----- ...

  4. POJ - 2528 区间离散化,线段树区间修改,区间询问

    这个题非常有意思的地方是,我们发现区间[1,4]和[5,8]是紧挨着的,因为这个的数代表的是一段区间,原本我们对于普通的离散, a[1]=1,a[2]=5,a[3]=6,a[4]=8;数组下标就是重新 ...

  5. hibernate在写cfg配置文件自动创建表时报错org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister

    在用hibernate框架时,写cfg文件,想自动生成表时,一般写<property name="hibernate.hbm2ddl.auto">create</ ...

  6. mysql 查看版本

    查看mysql版本的四种方法 - 风生水起 - 博客园 http://www.cnblogs.com/end/archive/2011/10/18/2216461.html 查看mysql数据库版本方 ...

  7. 如何入门vue之一

    入门vue 首先从vue的指令开始学起. vue的指令: v-if  根据是否得到的布尔值进行是否显示. v-show:根据是否得到的布尔值是否显示.不同的地方在于隐藏是style隐藏. v-on 监 ...

  8. oracle服务端安装与配置

    从oracle官网下载oracle服务端的安装包. 下载下来是两个压缩文件,两个压缩文件都解压(缺一不可)到同一目录下,最后会得到一个database文件夹. 双击database文件夹下的setup ...

  9. java lang(Comparable接口) 和java util(Comparator接口)分析比较

    //Comparable 接口强行对实现它的每个类的对象进行整体排序. -- 自然排序.类的compareTo称为自然比较方法. public interface Comparable<T> ...

  10. Spark源码编译,官网学习

    这里以spark-1.6.0版本为例 官网网址   http://spark.apache.org/docs/1.6.0/building-spark.html#building-with-build ...