问题

给定你一个n*m的图,图中有些‘*’点,其他是‘0’点,在每个‘*’点可以建雷达,每个雷达可以覆盖其上下左右四个方向的‘*’点之一,问你最少建多少雷达,可以将这些‘*’点全部覆盖。

分析

二分图,构图,如果我们把每个‘*’点虚拟成一个节点,分布在二分图的两侧。然后,如果两点能相互覆盖,我们就在两点之间连一条边。要求的问题就转化成了,二分图最小边覆盖!

为什么是二分图呢,以为每个点只能覆盖出自身之外的一个节点,这恰好满足匹配的定义。

怎样求解二分图中的最小边覆盖呢。我们知道,一个匹配可以覆盖到2个不同的节点,那么二分图最大匹配覆盖到的节点数=最大匹配数*2。还没有被覆盖到的节点=总共的节点数-最大匹配数*2。所以,二分图最小边覆盖=最大匹配数+总共的节点数-最大匹配数*2=总的的节点数-最大匹配数

code

program liukeke;
type pig=recordx,y:longint;
end;vara:array[1..1000,0..1000] of longint;pos:array[1..1000] of pig;match:array[1..1000] of longint;v:array[1..1000] of boolean;i,zu,ans,tot,n,m,j:longint;procedure init;
vari,j:longint;ch:char;
beginreadln(n,m);for i:=1 to n dobeginfor j:=1 to m dobeginread(ch);if ch='*' thenbegininc(tot);pos[tot].x:=i;pos[tot].y:=j;end;end;readln;end;for i:=1 to tot dofor j:=1 to tot doif i<>j thenbeginif ((abs(pos[i].x-pos[j].x)=1) and(abs(pos[i].y-pos[j].y)=0))or((abs(pos[i].x-pos[j].x)=0) and(abs(pos[i].y-pos[j].y)=1))thenbegininc(a[i,0]);a[i,a[i,0]]:=j;end;end;
end;function dfs(s:longint):boolean;
vari:longint;
beginfor i:=1 to a[s,0] doif not v[a[s,i]] thenbeginv[a[s,i]]:=true;if (match[a[s,i]]=0)or(dfs(match[a[s,i]]))thenbeginmatch[a[s,i]]:=s;exit(true);end;end;exit(false);
end;beginreadln(zu);for i:=1 to zu dobeginfillchar(a,sizeof(a),0);fillchar(pos,sizeof(pos),0);fillchar(match,sizeof(match),0);tot:=0;ans:=0;init;for j:=1 to tot dobeginfillchar(v,sizeof(v),false);if dfs(j) then inc(ans);end;writeln(tot-ans>>1);end;
end.

转载于:https://www.cnblogs.com/liukeke/archive/2011/03/20/1989697.html

【图论】【poj 3020】Antenna Placement相关推荐

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

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

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

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

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

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

  4. POJ 3020 Antenna Placement

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

  5. pku 3020 Antenna Placement

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

  6. NOIP 好题推荐(DP+搜索+图论)POJ ZOJ

    NOIP好题推荐(DP+搜索+图论)POJ ZOJ 1370 Gossiping (数论->模线性方程有无解的判断)+(图论->DFS)  1090 Chain ->格雷码和二进制码 ...

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

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

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

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

  9. Antenna Placement

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

  10. pku3020 Antenna Placement (解法1)

    题解:在一个n*m的棋盘上,有一些标志,问最少用多少个1*2的矩形可以把它们全部套住.  可以将每一个标志与其相邻的四个标志建一条边,这样就形成了一个无向图,题目的意思即要求最小的边数.使得所有的点都 ...

最新文章

  1. C++学习手记四:继承和多态
  2. 和日本萌妹一起读深度学习最新论文,阅读难度会降低吗?
  3. boost::log::expressions::has_attr用法的测试程序
  4. vue mixins
  5. 如何快速在CentOS搭建光盘【永久搭载光盘】
  6. 设置oracle 随机启动,配置Oracle单实例随机启动(11gR2)
  7. .net Core2.2 WebApi通过OAuth2.0实现微信登录
  8. 一文快速掌握 Git 用法(Git介绍及使用流程)
  9. 电脑屏保海底世界_电脑游戏假面骑士kiva中文版
  10. imu预积分_VINS 中的 IMU 预积分推导和代码解读
  11. 政府机构网络安全实战
  12. tensorflow代码学习:二分类模型
  13. 视频行为识别检测综述
  14. eeprom和编程器固件 k2_斐讯K2编程器刷breed换固件小白教程
  15. 手机12306买卧铺下铺技巧_手机上买火车票怎么买下铺
  16. 网络安全/渗透测试工具AWVS14.9下载/使用教程/安装教程
  17. 我的BLOG开张了,朋友们要是高兴捧个场,要是不高兴砸鸡蛋(鸡蛋请买草鸡蛋,我不喜欢吃洋鸡蛋)
  18. 第一篇 使用numpy创建数组(一维、多维)
  19. 【MOOC-生物信息学-生物数据库】
  20. pwc(普华永道)招聘.net

热门文章

  1. 从代码书写理解指针,很重要
  2. Nginx 常用配置,避坑指南!
  3. 今天我必须要全网曝光这几个公众号
  4. 推荐一些不错的公众号【一】
  5. Big day coming...
  6. 前端 如何获取response headers 中的set-cookie:_如何使用moco框架搭建接口mock服务
  7. razor 怎样使用session变量_有关 Session 的那些事儿
  8. DOCTYPE用法详解
  9. 数据库开发基础-教案-3-认识数据库备份和事务日志备份
  10. 使用easy_install安装BeautifulSoup——Python