二分图最大匹配(匈牙利算法) POJ 3020 Antenna Placement
题目传送门
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相关推荐
- 二分图最大匹配—匈牙利算法
二分图:又叫二部图,图G中顶点集V可以分成互不相交的子集(X,Y),并且图中的每一条边所关联的点分别属于两个不同的顶点集,则图G叫二分图.(不含奇环) 二分图的匹配:给定一个二分图G的子图M,M的边集 ...
- 二分图最大匹配-匈牙利算法
今天介绍 匈牙利算法 : 匈牙利算法,是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,由匈牙利数学家Edmonds于1965年提出,因而得名. 先介绍一下 ...
- POJ - 3020 Antenna Placement(最小路径覆盖-二分图最大匹配)
题目链接:点击查看 题目大意:给出一个n*m的地图,图中'o'代表空地,'*'代表城市,现在需要给城市装无线网,每个无线网最多可以覆盖相邻的两个城市,问覆盖所有的城市最少需要装多少个无线网 题目分析: ...
- 二分图最大匹配 - 匈牙利算法
问题描述: X集合(编号1~m),Y集合(编号m+1~n).n,m<100. 给出若干组合(x, y)(相当于映射x->y),问最都能同时有几个组合(分配). 分析: 题目可能简化描述得不 ...
- 二分图最大匹配——匈牙利算法
二分图最大匹配 (一).二分图的介绍 1.定义 2.充要条件 (二).二分图的匹配 1.二分图的最大匹配 2.增广路径 3.匈牙利算法 (1).复杂度 (2).算法思路 (3).代码实现 (一).二分 ...
- 二分图最大匹配(匈牙利算法Dinic算法)
二分图最大匹配: 给出一个二分图,左边有若干个节点,右边有若干个节点,左边的节点想到匹配右边的节点,每个左边的节点每个都有若干个可以选择的对象,每个左边节点只能选择一个右边节点,每个右边节点也只能被选 ...
- NYOJ 题目239 月老的难题 (二分图最大匹配-匈牙利算法模板)
月老的难题 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福的一 ...
- NYOJ - 239 - 月老的难题 ( 二分图最大匹配 匈牙利算法 )
描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福的一家,部分可能不会结成幸福的家庭. 现在已知哪些男孩与哪些女孩如果结婚的话,可以结成幸 ...
- poj 3020 Antenna Placement(二分图最大匹配)
题意: N行M列的矩阵,每个格子里不是 * 就是 O . * :是一个利益点. O:是一个空白点. 每次可以用一个圈覆盖相邻的两个*.(左右相邻或上下相邻). 问最少需要多少个圈可以覆盖所有的*. 思 ...
最新文章
- 年轻人裸辞,需不需要“冷静期”?
- 隔空操控iPhone!苹果新获悬停手势专利
- 如何用最傻的办法查看tensorflow-yolov3模型测试VOC数据集时预测值(图框)与真实值(图框)的对比效果?
- NLP jieba分词源码解析
- boost::stl_interfaces模块实现互操作性的测试程序
- 快速掌握MATLAB应用,从这一步开始
- Excel与DataGridView的操作示例
- php 购物车案例教程,php初步实现购物车功能的实例分析
- Linux下OneinStack一键安装JAVA+PHP+Tomcat+Nginx+MySQL网站环境
- windows分辨率修改工具_小视频压缩、倒放,这些小工具轻松搞定
- [转载] Python Dictionary用法小结
- wepy公共样式_小程序开发wepy框架类vue的开发方式
- 李宏毅 Gradient Descent总结
- f-stack nginx 单进程模式启动流程分析
- 基于C#实现的简易绘图工具设计
- WIN10开机启动深度优化超详细万字以上,开机5秒
- 系统集成j2cache
- 如何快速在线压缩图片大小(包括放大、缩小图片,指定图片尺寸和压缩图片品质)
- ristretto255对外API抽象及基于Curve25519的ristretto255层实现
- 备战秋招-oppo java一面 面经