PKU 3041 Asteroids 最小点覆盖(最大匹配模板题)
题目大意:给你一个N*N的矩阵, 里面有K个星球, 我们可以让武器攻击矩阵的一行或者一列来使得这个星球被击碎, 现在问你最少需要几个这种武器才能把所有的星球击碎?
解题思路:关键是建模构图
把每一行当成一个行节点(也当成一把武器,因为一把武器可以消灭一行),构成集合1,每一列当成一个列节点(也当成一把武器,因为一把武器可以消灭一列),构成集合2,则共有2*N(N个行节点,N个列节点,即2*N把武器)节点。若某行某列有一个障碍物,则该行节点和该列节点之间构成一条边。每一个障碍物的位置坐标将集合1与集合2中的点连接起来,也就是将每一个障碍物作为连接节点的边。假设1个行节点覆盖了5个列节点,即这个行节点与这5个列节点间有5条边(即五个障碍物),由于这5条边都被那个行节点覆盖,即表明这5个障碍物都在同一行上,于是可以一把武器全部清除。这样可以轻易的得出本题是一个最小点覆盖的问题。又有一个定理是:最小点覆盖数 = 最大匹配数,所以此题转化成求最大匹配数,有几把武器匹配成功,即需要射击几次,匹配成功的武器越多,射击的次数也就越少。
#include<iostream>
#include<cstring>
using namespace std;
bool vis[];
int n,k,x,y;
int graph[][],link[];
bool Find(int x)
{
for(int i=;i<=n;i++){
if(graph[x][i]&&!vis[i]){
vis[i]=;//为了下一条语句中调用find做准备的,以免重复
if(!link[i]||Find(link[i])){
link[i]=x;
return true;
}
}
}
return false;
} int main()
{
memset(link,,sizeof(link));
memset(graph,,sizeof(graph));
cin>>n>>k;
for(int i=;i<=k;i++){
cin>>x>>y;
graph[x][y]=;
}
int ans=;
for(int i=;i<=n;i++){
memset(vis,,sizeof(vis));
if(Find(i))
ans++;
}
cout<<ans<<endl;
}
PKU 3041 Asteroids 最小点覆盖(最大匹配模板题)的更多相关文章
- poj 3041 Asteroids(最小点覆盖)
http://poj.org/problem?id=3041 Asteroids Time Limit: 1000MS Memory Limit: 65536K Total Submissions ...
- poj 3041 Asteroids 最小点覆盖/最大匹配
Asteroids Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16242 Accepted: 8833 Descriptio ...
- [poj] 3041 Asteroids || 最小点覆盖=最大二分图匹配
原题 本题为最小点覆盖,而最小点覆盖=最大二分图匹配 //最小点覆盖:用最少的点(左右两边集合的点)让每条边都至少和其中一个点关联. #include<cstdio> #include&l ...
- POJ 3041 Asteroids (最小点覆盖集)
题意 给出一个N*N的矩阵,有些格子上有障碍,要求每次消除一行或者一列的障碍,最少消除多少次可以全部清除障碍. 思路 把关键点取出来:一个障碍至少需要被它的行或者列中的一个消除. 也许是最近在做二分图 ...
- POJ 3041 Asteroids 最小点覆盖 == 二分图的最大匹配
Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape o ...
- Asteroids POJ - 3041 二分图最小点覆盖
Asteroids POJ - 3041 Bessie wants to navigate her spaceship through a dangerous asteroid field in ...
- Asteroids POJ - 3041 【最小点覆盖集】
Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N g ...
- 【POJ 3041】Asteroids (最小点覆盖)
每次选择清除一行或者一列上的小行星.最少选择几次. 将行和列抽象成点,第i行为节点i+n,第j列为节点j,每个行星则是一条边,连接了所在的行列. 于是问题转化成最小点覆盖.二分图的最小点覆盖==最大匹 ...
- poj 3041 Asteroids (二分图的最大匹配 第一题)
题目:http://poj.org/problem?id=3041 题意:在某个n*n的空间内,分布有一些小行星,某人在里面打炮,放一枪后某一行或某一列的行星就都没了,让求最少的打炮数. 然后把每行x ...
随机推荐
- media wiki run on nginx
1. 环境安装: nginx安装 nginx-1.5.7 php安装 PHP 5.4.10 (cli) (built: Jul 30 2014 16:45:08) mysql安装 Ver 14.14 ...
- javascript年月日日期筛选控件
来源:http://www.sucaihuo.com/js/1158.html demo:http://www.sucaihuo.com/jquery/11/1158/demo/
- CSS顶级技巧大放送,div+css布局必知
字体大小使用px 在一行内声明CSS 对比下面两个: h2 {font-size:18px; border:1px solid blue; color:#000; } h2 { font-siz ...
- poj_3260 动态规划
题目大意 顾客拿着N种硬币(币值为value[i], 数量为c[i])去买价值为T的东西,商店老板也有同样N种币值的硬币,但是数量不限.顾客买东西可能需要用硬币找零来使得花出去的钱为T,求顾客给老板的 ...
- MemSQL start[c]up Round 1.E
完全的乱搞题啊... 被坑的要死. 拿到题目就觉得是规律题加构造题, 然后找了了几个小时无果,只知道n为奇数的时候是一定无解的,然后当n为偶数的时候可能有很多解,但是如果乱选择的话,很有可能形成无解的 ...
- 打包签名时出现Conversion to Dalvik format failed with error 1
今天在导出签名APK时,居然出现了“Conversion to Dalvik format failed with error 1” 于是,我习惯性地“Project”->“Clean”,把工程 ...
- 启动phpstyle Apache的80端口被win7的System PID=4的进程占用的解决方法 以及 如何在phpStyle里发布程序
学习前端是,用到Ajax,php语言,操作mysql数据库,浏览器无法解析php代码(把源码输出):原因,我之前用的是tomcat服务器写jsp,servlet,php用的是apache服务器,没有配 ...
- Sublime Text 3如何编译运行c++程序
扯 去了一趟清北学堂感觉自己玩的特别嗨,算法没学到什么,前端和爬虫的知识到是会了不少. 然后知道了有一个叫做sublime text 3的编辑器,好用不好用不知道,就冲着它好看,就决定以后就用它了. ...
- h5+的Downloader下载网络图片缓存到本地的案例
之前展示图片都是通过<img src="网络图片地址"> , 每次都请求服务器, 加载比较慢;如何做到显示图片的时候先从本地获取,没有则联网下载,缓存到本地;下次直接从 ...
- [iPhone硬件]-GPS定位的使用
iPhone中GPS定位如何使用 关键词 1.info.plist配置授权描述 2.引入库 3.CLLocationManager的使用 info.plist配置 在info.plist中根据情况加入 ...