题目传送门

  1 /*
  2     题意:*的点占据后能顺带占据四个方向的一个*,问最少要占据多少个
  3     匈牙利算法:按坐标奇偶性把*分为两个集合,那么除了匹配的其中一方是顺带占据外,其他都要占据
  4 */
  5 #include <cstdio>
  6 #include <algorithm>
  7 #include <cstring>
  8 #include <vector>
  9 using namespace std;
 10
 11 const int MAXN = 4e2 + 10;
 12 const int INF = 0x3f3f3f3f;
 13 char s[44][11];
 14 int ha[44][11];
 15 bool vis[MAXN];
 16 int lk[MAXN];
 17 vector<int> G[MAXN];
 18 int dx[4] = {-1, 1, 0, 0};
 19 int dy[4] = {0, 0, -1, 1};
 20 int un, vn;
 21
 22 bool DFS(int u)
 23 {
 24     for (int i=0; i<G[u].size (); ++i)
 25     {
 26         int v = G[u][i];
 27         if (!vis[v])
 28         {
 29             vis[v] = true;
 30             if (lk[v] == -1 || DFS (lk[v]))
 31             {
 32                 lk[v] = u;  return true;
 33             }
 34         }
 35     }
 36
 37     return false;
 38 }
 39
 40 int hungary(void)
 41 {
 42     int res = 0;    memset (lk, -1, sizeof (lk));
 43     for (int i=1; i<=un; ++i)
 44     {
 45         memset (vis, false, sizeof (vis));
 46         if (DFS (i))    res++;
 47     }
 48
 49     return res;
 50 }
 51
 52 int main(void)        //POJ 3020 Antenna Placement
 53 {
 54     //freopen ("POJ_3020.in", "r", stdin);
 55
 56     int t;  scanf ("%d", &t);
 57     while (t--)
 58     {
 59         int h, w;   scanf ("%d%d", &h, &w);
 60         for (int i=1; i<=h; ++i)
 61         {
 62             scanf ("%s", s[i] + 1);
 63         }
 64
 65         un = vn = 0;
 66         for (int i=1; i<=h; ++i)
 67         {
 68             for (int j=1; j<=w; ++j)
 69             {
 70                 if (s[i][j] == '*')
 71                 {
 72                     if ((i+j) & 1)  ha[i][j] = ++un;
 73                     else    ha[i][j] = ++vn;
 74                 }
 75             }
 76         }
 77
 78         for (int i=1; i<=un; ++i)   G[i].clear ();
 79
 80         for (int i=1; i<=h; ++i)
 81         {
 82             for (int j=1; j<=w; ++j)
 83             {
 84                 if (s[i][j] == '*' && (i+j) & 1)
 85                 {
 86                     for (int k=0; k<4; ++k)
 87                     {
 88                         int tx = i + dx[k]; int ty = j + dy[k];
 89                         if (tx >= 1 && tx <= h && ty >= 1 && ty <= w && s[tx][ty] == '*')
 90                             G[ha[i][j]].push_back (ha[tx][ty]);
 91                     }
 92                 }
 93             }
 94         }
 95
 96         printf ("%d\n", un + vn - hungary ());
 97     }
 98
 99     return 0;
100 }

转载于:https://www.cnblogs.com/Running-Time/p/4652282.html

二分图最大匹配(匈牙利算法) POJ 3020 Antenna Placement相关推荐

  1. 二分图最大匹配—匈牙利算法

    二分图:又叫二部图,图G中顶点集V可以分成互不相交的子集(X,Y),并且图中的每一条边所关联的点分别属于两个不同的顶点集,则图G叫二分图.(不含奇环) 二分图的匹配:给定一个二分图G的子图M,M的边集 ...

  2. 二分图最大匹配-匈牙利算法

    今天介绍 匈牙利算法 : 匈牙利算法,是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,由匈牙利数学家Edmonds于1965年提出,因而得名. 先介绍一下 ...

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

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

  4. 二分图最大匹配 - 匈牙利算法

    问题描述: X集合(编号1~m),Y集合(编号m+1~n).n,m<100. 给出若干组合(x, y)(相当于映射x->y),问最都能同时有几个组合(分配). 分析: 题目可能简化描述得不 ...

  5. 二分图最大匹配——匈牙利算法

    二分图最大匹配 (一).二分图的介绍 1.定义 2.充要条件 (二).二分图的匹配 1.二分图的最大匹配 2.增广路径 3.匈牙利算法 (1).复杂度 (2).算法思路 (3).代码实现 (一).二分 ...

  6. 二分图最大匹配(匈牙利算法Dinic算法)

    二分图最大匹配: 给出一个二分图,左边有若干个节点,右边有若干个节点,左边的节点想到匹配右边的节点,每个左边的节点每个都有若干个可以选择的对象,每个左边节点只能选择一个右边节点,每个右边节点也只能被选 ...

  7. NYOJ 题目239 月老的难题 (二分图最大匹配-匈牙利算法模板)

    月老的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福的一 ...

  8. NYOJ - 239 - 月老的难题 ( 二分图最大匹配 匈牙利算法 )

    描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福的一家,部分可能不会结成幸福的家庭. 现在已知哪些男孩与哪些女孩如果结婚的话,可以结成幸 ...

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

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

最新文章

  1. 年轻人裸辞,需不需要“冷静期”?
  2. 隔空操控iPhone!苹果新获悬停手势专利
  3. 如何用最傻的办法查看tensorflow-yolov3模型测试VOC数据集时预测值(图框)与真实值(图框)的对比效果?
  4. NLP jieba分词源码解析
  5. boost::stl_interfaces模块实现互操作性的测试程序
  6. 快速掌握MATLAB应用,从这一步开始
  7. Excel与DataGridView的操作示例
  8. php 购物车案例教程,php初步实现购物车功能的实例分析
  9. Linux下OneinStack一键安装JAVA+PHP+Tomcat+Nginx+MySQL网站环境
  10. windows分辨率修改工具_小视频压缩、倒放,这些小工具轻松搞定
  11. [转载] Python Dictionary用法小结
  12. wepy公共样式_小程序开发wepy框架类vue的开发方式
  13. 李宏毅 Gradient Descent总结
  14. f-stack nginx 单进程模式启动流程分析
  15. 基于C#实现的简易绘图工具设计
  16. WIN10开机启动深度优化超详细万字以上,开机5秒
  17. 系统集成j2cache
  18. 如何快速在线压缩图片大小(包括放大、缩小图片,指定图片尺寸和压缩图片品质)
  19. ristretto255对外API抽象及基于Curve25519的ristretto255层实现
  20. 备战秋招-oppo java一面 面经

热门文章

  1. jdbcdslog hibernate sql log
  2. ZYNQ 的三种GPIO :MIO EMIO AXI_GPIO
  3. Vivado时钟分组约束的三类应用
  4. Matlab求方差,均值,均方差,协方差的函数
  5. Word中的自定义编号详解及疑难汇总!
  6. VMware和Linux版本搭配问题
  7. 风水学是天气预测模型
  8. dearpygui-0.6.6 以前的蛇变成了这个样子
  9. SharpWebMail介绍和安装(转)
  10. 2018年『web』开发者不得不知的技术趋势