poj3041,poj2226
二分匹配的灵活运用
3041还是比较好想的,考虑到横排/竖排射一枪就能搞定这一行/一列的所有点,
我们以行数为点集x,列数为点集y,在目标点(xi,yi)之间连一条边
这样最小射击次数=最小点覆盖(边两端点至少有一个点在覆盖集中)=最大匹配
poj2226是它的加强版
这里一块木板不能覆盖非泥泞点,也就是说一块木板不一定能搞定那一行所有的点
于是我们考虑到将连续的泥泞点标号,表示这些泥泞点是由哪个木板盖住(横竖分别标号)
这样,我们以横排木板为点集x,竖排木板为点集y,对于每个点,在盖住它的横竖排木板之间连边
(显然,每个点至多被一个横木板,一个竖木板覆盖)
于是根据poj3041,做匈牙利即可
var a:array[..,..] of char;
h1,h2:array[..,..] of longint;
map:array[..,..] of boolean;
cx,cy:array[..] of longint;
v:array[..] of boolean;
s1,s2,ans,i,j,n,m:longint; function find(x:longint):longint; //增广路
var i:longint;
begin
for i:= to s2 do
if map[x,i] and not v[i] then
begin
v[i]:=true;
if (cy[i]=-) or (find(cy[i])>) then
begin
cx[x]:=i;
cy[i]:=x;
exit();
end;
end;
exit();
end; begin
readln(n,m);
for i:= to n do
begin
for j:= to m do
begin
read(a[i,j]);
end;
readln;
end;
for i:= to n do //横排标号
begin
j:=;
while j<=m do
begin
if a[i,j]='*' then
begin
inc(s1);
h1[i,j]:=s1;
inc(j);
while a[i,j]='*' do
begin
h1[i,j]:=s1;
inc(j);
end;
end
else inc(j);
end;
end;
for i:= to m do //竖排标号
begin
j:=;
while j<=n do
begin
if a[j,i]='*' then
begin
inc(s2);
h2[j,i]:=s2;
inc(j);
while a[j,i]='*' do
begin
h2[j,i]:=s2;
inc(j);
end;
end
else inc(j);
end;
end;
for i:= to n do
for j:= to m do
map[h1[i,j],h2[i,j]]:=true; //连边
fillchar(cx,sizeof(cx),);
fillchar(cy,sizeof(cy),);
for i:= to s1 do //匈牙利
if cx[i]=- then
begin
fillchar(v,sizeof(v),false);
ans:=ans+find(i);
end;
writeln(ans);
end.
一定要注意问题建模的灵活运用;
poj3041,poj2226的更多相关文章
- POJ-1325 Machine Schedule,和3041有着异曲同工之妙,好题!
Machine Schedule Time Limit: 1000MS Memory Limit: 10000K Description As we all know, machine ...
- ZOJ 1654 Place the Robots(最大匹配)
Robert is a famous engineer. One day he was given a task by his boss. The background of the task was ...
- Pyhton开源框架(加强版)
info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...
- MPlayer
名称 mplayer − 电影播放器 mencoder − 电影编解码器 概要 mplayer [选项] [文件|URL|播放列表|−] mplayer [选项] 文件1 [指定选项] [文件 ...
- python 爬取腾讯微博并生成词云
本文以延参法师的腾讯微博为例进行爬取并分析 ,话不多说 直接附上源代码.其中有比较详细的注释. 需要用到的包有 BeautifulSoup WordCloud jieba # coding:utf-8 ...
- 面经 cisco
1. 优先级反转问题及解决方法 (1)什么是优先级反转 简单从字面上来说,就是低优先级的任务先于高优先级的任务执行了,优先级搞反了.那在什么情况下会生这种情况呢? 假设三个任务准备执行,A,B,C,优 ...
- linux驱动(续)
网络通信 --> IO多路复用之select.poll.epoll详解 IO多路复用之select.poll.epoll详解 目前支持I/O多路复用的系统调用有 select,psel ...
- HttpServletRequest对象(一)
javaweb学习总结(十)——HttpServletRequest对象(一) 一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HT ...
- 【poj2226】 Muddy Fields
http://poj.org/problem?id=2226 (题目链接) 题意 给出一个只包含‘.’和‘*’的矩阵,用任意长度的宽为1的木板覆盖所有的‘*’而不覆盖‘.’,木板必须跟矩形的长或宽平行 ...
随机推荐
- aix 安装redis
下载最新rpm安装包 http://www.perzl.org/aix/index.php?n=Main.Redis # uname -aAIX rhjf 1 6 00C5CC964C00# pwd/ ...
- git命令行
cmd下运行或者 进入git bash运行 输入 exit退出切换到仓库目录后再git statusgit commit -m 注释 git pull origin1 mastergit push o ...
- 《C和指针》 读书笔记 -- 第7章 函数
1.当程序调用一个无法见到原型的函数时,编译器便认为该函数返回一个整型值.如果这个值实际上是非整型值时,还得执行类型转换,所以函数原型声明有时很重要. 2.值的类型并不是值的内在本质,而是取决于它被使 ...
- CC2640-之功耗
一.测量方式,以DEMO板测量,以消除其它外围不同造成的电流不同. 二.测量结果 以原厂simpleBLEperipheral工程为例 1.如果在低功耗模式下,+5DB发射,最小电流为1.66MA 2 ...
- 长安CS15_手动——16款
一.输入数据 1.CAN总线描述:位置,颜色,速率,总线类型 1)位置:OBD 2)颜色:3) 速率:500k 4)总线类型:HSCAN 5)测试时间:2016.5.4 2.车辆特征 1)排量:1.5 ...
- Android 管理Activity中的fragments
为了管理Activity中的fragments,需要使用FragmentManager,为了得到它,需要调用Activity中的getFragmentManager()方法,接下来详细介绍,感兴趣的朋 ...
- mac 下 sphinx + mysql + php 实现全文搜索(xampp)(4)php api 解析
1:function GetLastError() // 假如报错的话,会输出报错信息 2:function GetLastWarning ()// 输出 警告信息 3:function SetSe ...
- 十六、mysql 分区之 简单sql优化2
.索引的分类 B-Tree 基本支持 HASH 只有memory支持 R-Tree myisam支持 Full-text myisam支持(全文索引) .Memory引擎下只有“=”条件才会使用索引 ...
- nginx低版本不支持pathinfo模式,thinkphp针对此问题的解决办法
将一个thinkphp项目从apache环境移到nginx1.2上,怎奈,nginx这个版本默认不支持pathinfo模式 首先,编辑nginx的虚拟主机配置文件 location ~ .*.(php ...
- MINA快速传输文件
最近的项目使用MNA进行文件传输,只能传输到5~7MB/s:但是使用FTP等软件其实可以达到11MB/s,后来使用MINA原生传输,发现可以达到11MB/s,后来发现有以下两点可以需要注意优化: 1. ...