ZOJ-1654 Place the Robots---二分图最小点覆盖+构图
题目链接:
https://vjudge.net/problem/ZOJ-1654
题目大意:
有一个N*M(N,M<=50)的棋盘,棋盘的每一格是三种类型之一:空地、草地、墙。机器人只能放在空地上。在同一行或同一列的两个机器人,若它们之间没有墙,则它们可以互相攻击。问给定的棋盘,最多可以放置多少个机器人,使它们不能互相攻击。
解题思路:
和POJ-2226类似
我们将每一行,每一列被墙隔开,且包含空地的连续区域称作“块”。显然,在一个块之中,最多只能放一个机器人,我们把这些块编上号。同样,把竖直方向的块也编上号。如下图:
把每个横向块看作X部的点,竖向块看作Y部的点,若两个块有公共的空地,则在它们之间连边。于是,问题转化成这样的一个二分图:
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #include<vector> 6 #include<queue> 7 using namespace std; 8 typedef pair<int, int> Pair ; 9 typedef long long ll; 10 const int INF = 0x3f3f3f3f; 11 const int maxn = 2500 + 10; 12 vector<int>G[maxn]; 13 int cx[maxn], cy[maxn]; 14 int cntx, cnty; 15 bool vis[maxn]; 16 17 void init(int n) 18 { 19 for(int i = 0; i <= n; i++)G[i].clear(); 20 } 21 bool dfs(int u) 22 { 23 for(int i = 0; i < G[u].size(); i++) 24 { 25 int v = G[u][i]; 26 if(!vis[v]) 27 { 28 vis[v] = 1; 29 if(cy[v] == -1 || dfs(cy[v])) 30 { 31 cx[u] = v; 32 cy[v] = u; 33 return true; 34 } 35 } 36 } 37 return false; 38 } 39 40 int maxmatch() 41 { 42 memset(cx, -1, sizeof(cx)); 43 memset(cy, -1, sizeof(cy)); 44 int ans = 0; 45 for(int i = 1; i <= cntx; i++) 46 { 47 if(cx[i] == -1) 48 { 49 memset(vis, 0, sizeof(vis)); 50 ans += dfs(i); 51 } 52 } 53 return ans; 54 } 55 char Map[55][55]; 56 int T, n, m, cases; 57 void build_Map() 58 { 59 //横向标号 60 int a[55][55], b[55][55]; 61 memset(a, 0, sizeof(a)); 62 memset(b, 0, sizeof(b)); 63 cntx = cnty = 0; 64 for(int i = 0; i < n; i++) 65 { 66 for(int j = 0; j < m; j++) 67 { 68 if(Map[i][j] == 'o') 69 { 70 a[i][j] = ++cntx; 71 j++; 72 while(j < m && Map[i][j] != '#') 73 a[i][j] = a[i][j - 1], j++; 74 } 75 } 76 } 77 //竖向编号 78 for(int j = 0; j < m; j++) 79 { 80 for(int i = 0; i < n; i++) 81 { 82 if(Map[i][j] == 'o') 83 { 84 b[i][j] = ++cnty; 85 i++; 86 while(i < n && Map[i][j] != '#') 87 b[i][j] = b[i - 1][j], i++; 88 } 89 } 90 } 91 init(cntx);//初始化Map 92 for(int i = 0; i < n; i++) 93 for(int j = 0; j < m; j++) 94 if(Map[i][j] == 'o')G[a[i][j]].push_back(b[i][j]); 95 } 96 int main() 97 { 98 99 cin >> T; 100 while(T--) 101 { 102 cin >> n >> m; 103 for(int i = 0; i < n; i++)cin >> Map[i]; 104 build_Map(); 105 printf("Case :%d\n", ++cases); 106 cout<<maxmatch()<<endl; 107 } 108 return 0; 109 }
转载于:https://www.cnblogs.com/fzl194/p/8874584.html
ZOJ-1654 Place the Robots---二分图最小点覆盖+构图相关推荐
- 二分图最小点覆盖构造方案+König定理证明
原文链接 前言 博主很笨 ,如有纰漏,欢迎在评论区指出讨论. 二分图的最大匹配使用 DinicDinicDinic 算法进行实现,时间复杂度为 O(ne)O(n\sqrt{e})O(ne),其中, ...
- POJ 2226 二分图最小点覆盖
题意 传送门 POJ 2226 题解 每个泥泞地需要被至少一块横着或竖着的板子覆盖,那么预处理出不能覆盖草地的限制下,所有尽可能长的横板子与竖板子.对可覆盖同一块泥泞地的 222 块板子连边,则转化为 ...
- POJ - 3041 Asteroids 二分图最小点覆盖
题目链接 二分图一个很重要的定理:看了很多大神的博客表示看不懂为什么,以后再看 最小点覆盖=最大匹配 最小点覆盖就是在二分图里边,选择一个点,将所有与该点相链接的边删去,问最小找多少个点能够把所有的边 ...
- hihocoder 1127 : 二分图三·二分图最小点覆盖和最大独立集
最大独立集问题: 在图G中选取尽可能多的点,使得任意两个点之间没有连边. 结论:最大独立集的点数 = 总点数 - 二分图最大匹配 证明: 假设最大独立集的点数为|U|,二分图最大匹配的匹配数为|M|, ...
- hdu 1054 Strategic Game 二分图最小点覆盖
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054 题意: 给出一个无向图,求最小点覆盖. 思路: 用网络流来做设立一个超级源点和一个超级汇点. 每 ...
- 二分图最小点覆盖König定理的简单证明
König定理是一个二分图中很重要的定理,它的意思是,一个二分图中的最大匹配数等于这个图中的最小点覆盖数.如果你还不知道什么是最小点覆盖,我也在这里说一下:假如选了一个点就相当于覆盖了以它为端点的所有 ...
- 【二分图|最小点覆盖集】König定理及其证明
转自Matrix67 二分图最大匹配的König定理及其证明 如果你看不清楚第二个字母,下面有一个大号字体版本: 二分图最大匹配的König定理及其证明 本文将是这一系列里最短的一篇,因为我只打算把K ...
- 图论——二分图——最小点覆盖
最小点集覆盖 == 最大匹配 一.什么是最小点覆盖 点覆盖的概念定义: 对于图G=(V,E)中的一个点覆盖是一个集合S⊆V使得每一条边至少有一个端点在S中. 最小点覆盖:点个数最少的S集合. 这是我个 ...
- [luogu3231 HNOI2013] 消毒 (二分图最小点覆盖)
传送门 Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为abc,a.b.c 均为正整数.为了实验的方便,它被划分为abc ...
最新文章
- 如何用python画圆形的代码-Python实现的圆形绘制(画圆)示例
- Android——使用纯java代码实现线性布局(通俗易懂)
- hadoop 动态调整mapred参数
- adb logcat 保存_保存的logcat在Android设备上的文本文件
- 用计算机画有常数的函数图像,信息技术应用 用计算机画函数图象教学设计及教案分析...
- 如何给页面加上loding_excel打印区域页面设置
- SentinelResource注解配置下_客户自定义限流处理_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0047
- Webpack入门——使用Webpack打包Angular项目的一个例子
- 微信小程序之表单验证
- 十大排序算法Java
- 60个英文阅读网站强力推荐
- USACO-Section3.2 Feed Ratios【克莱默法则】
- VMware安装macOS High Sierra V10.13.6完整版
- 软件破解高手常用的破解工具介绍
- 使用k-means聚类anchors
- 线性回归方程b保留几位小数_实验室原始数据怎么保留最准确?(一)
- 信道估计中的导频结构
- ubuntu vi/vim退出文件
- 【前端】制作个人博客第三天
- velocity模板技术生成word文档
热门文章
- 【初学者指南】在ASP.NET MVC 5中创建GridView
- px,em,rem,vh,vw,vmin,vmax的区别
- 《Div+CSS 3.0网页布局案例精粹》扫描版[PDF]
- 艾伟:FCKeditor 配置、扩展
- oracle io profile,ORACLE 中 PROFILE的管理
- java并行任务dispatch_Java模拟 双分派Double Dispatch
- mysql数据库备份总结_mysql中mysqlhotcopy备份数据库总结
- LINUX按照物理地址预取,linux – 如何以编程方式禁用硬件预取?
- java qq ui界面,java UI之QQ登录
- LSTM情感分类问题再战