UVA 11419 SAM I AM (最小点覆盖,匈牙利算法)
题意:给一个r*c的矩阵,某些格子中可能有一些怪物,可以在一行或一列防止一枚大炮,大炮会扫光整行/列的怪,问最少需要多少炮?输出炮的位置。
思路:
先每行和列都放一个炮,把炮当成点,把怪当成边,一边连接行炮,另一边是列炮,只要其中任何一个扫了,另一个就不必了。所以明显是求最小点覆盖,用最少的点(即炮)覆盖最多的边(即怪)。进而转成最大匹配。因 最大匹配数=最小覆盖数。
这题还得求炮的位置,也就是覆盖点集。可以根据匈牙利数来构造,而且可以用同匈牙利算法那个DFS函数,稍微加点东西而已。神奇之处在于,从S中所有未盖点出发扩展匈牙利树,标记树上的S和T集中的点,则S中没有被标记的加上T中被标记的,就是一个最小覆盖集了。
一个比较直观的解释:假设S集中已经匹配的点就是我们要选择的覆盖集,但是S集中难免会有一些点是未匹配的,如果它没有边时这还不要紧,要是恰好有边时不就覆盖不到了吗?考虑将已经选择的覆盖集转移一下,因为之前纯选择S集中的匹配点,不如把某些点从覆盖集中删去,而换成T集中相应数量的匹配点。但是换哪些比较合适?当然是得覆盖到S集中那些有边的未匹配点,还有那些刚删的匹配点啦。这可以从那个带有边的未匹配点出发扩展匈牙利树,就会将T集中部分点给勾选出来了,这些点正是我们想要的,而左边集应该删的是哪些点?就是也是匈牙利树扩展出来的点,哈哈~
#include <bits/stdc++.h>
#define max(X,Y) ((X) > (Y) ? (X) : (Y))
#define min(X,Y) ((X) < (Y) ? (X) : (Y))
#define pii pair<int,int>
#define INF 0x7f7f7f7f
#define LL long long
using namespace std;
const int N=;
int g[N][N];
int girl[N], boy[N], S[N], vis[N];
int r,c; int hungary(int x)
{
S[x]=;
for(int i=; i<=c; i++)
{
if(!vis[i] && g[x][i])
{
vis[i]=true;
if(!girl[i] || hungary(girl[i]))
{
girl[i]=x;
boy[x]=i;
return true;
}
}
}
return false;
} int cal(int n)
{
memset(girl, ,sizeof(girl));
memset(boy, ,sizeof(boy));
int cnt=;
for(int i=; i<=r; i++)
{
memset(vis, ,sizeof(vis));
if(hungary(i)) cnt++;
}
printf("%d",cnt);
memset(S, ,sizeof(S));
memset(vis, ,sizeof(vis));
for(int i=; i<=r; i++) if(!boy[i]) hungary(i); //未匹配的男 for(int i=; i<=r; i++)
if(!S[i]) printf(" r%d", i);
for(int i=; i<=c; i++)
if(vis[i]) printf(" c%d", i);
printf("\n");
} int main()
{
freopen("input.txt", "r", stdin);
int a,b,n;
while(scanf("%d%d%d", &r,&c,&n), r+c+n)
{
memset(g, , sizeof(g));
for(int i=; i<=n; i++)
{
scanf("%d%d",&a,&b);
g[a][b]=; //单向
}
cal(n);
}
return ;
}
AC代码
UVA 11419 SAM I AM (最小点覆盖,匈牙利算法)的更多相关文章
- UVALive 6811 Irrigation Line(二分图最小点覆盖--匈牙利算法)
题意:求最少的线可以覆盖一个由0.1两种数字组成的图中所有的1. eg: 只需要两条线即可. 分析: 1.先为上述例子的行列标号 2.若图中数字为1,则代表该数字所在的行与列有关联. 例如第r1行第c ...
- [POJ3041] Asteroids(最小点覆盖-匈牙利算法)
传送门 题意: 给一个N*N的矩阵,有些格子有障碍,要求我们消除这些障碍,问每次消除一行或一列的障碍,最少要几次. 解析: 把每一行与每一列当做二分图两边的点. 某格子有障碍,则对应行与列连边. ...
- UVa 11419 SAM I AM (最小覆盖数)
题意:给定一个 n * m 的矩阵,有一些格子有目标,每次可以消灭一行或者一列,问你最少要几次才能完成. 析:把 行看成 X,把列看成是 Y,每个目标都连一条线,那么就是一个二分图的最小覆盖数,这个答 ...
- UVA 11419 SAM I AM(最大二分匹配&最小点覆盖:König定理)
题意:在方格图上打小怪,每次可以清除一整行或一整列的小怪,问最少的步数是多少,又应该在哪些位置操作(对输出顺序没有要求). 分析:最小覆盖问题 这是一种在方格图上建立的模型:令S集表示“行”,T集表示 ...
- Uva - 11419 - SAM I AM
题意:一个矩形——R*C的网格,在某些位置上有石头,在网格外开一炮可以打掉该行或者该列的石头,求打掉这些石头最少需要多少门大炮,位置分别设在哪行哪列(0<R<1001, 0 < C ...
- UVA 12549 Sentry Robots (最小点覆盖)
这道题挺像hdu 5093 Battle ships的,不过那道题是要求最多放置的点数,而这道题是要求最小点覆盖. 顶点覆盖的定义是:在G中任意边至少有一个端点属于顶点集合S. 一个重要的位置有(x, ...
- UVA11419 SAM I AM —— 最小点覆盖 + 输出覆盖点集
题目链接:https://vjudge.net/problem/UVA-11419 题解: 1.二分图匹配之最小点覆盖.:把x坐标和y坐标看成是点, 图中的目标看成是边,所以最终的目的是求出用最少的点 ...
- UVa 12549 机器人警卫(最小点覆盖)
https://vjudge.net/problem/UVA-12549 题意: 在一个Y行X列的网格里有空地(.),重要位置(*)和障碍物(#),用最少的机器人看守所有重要位置,每个机器人要放在一个 ...
- UVa 11419 我是SAM(最小点覆盖+路径输出)
https://vjudge.net/problem/UVA-11419 题意:一个网格里面有一些目标,可以从某一行,某一列发射一发子弹,可以打掉它:求最少的子弹,和在哪里打? 思路: 每个点的x坐标 ...
随机推荐
- POJ - 2142 The Balance(扩展欧几里得求解不定方程)
d.用2种砝码,质量分别为a和b,称出质量为d的物品.求所用的砝码总数量最小(x+y最小),并且总质量最小(ax+by最小). s.扩展欧几里得求解不定方程. 设ax+by=d. 题意说不定方程一定有 ...
- 查看JVM运行时堆内存
利用jmap和MAT等工具查看JVM运行时堆内存 https://www.cnblogs.com/cjsblog/p/9561375.html jmap JDK自带了一些工具可以帮助我们查看JVM运行 ...
- 【POJ 1061】 青蛙的约会
[题目链接] 点击打开链接 [算法] 列出同余方程,然后用exgcd求解 [代码] #include <algorithm> #include <bitset> #includ ...
- 详细的Ajax使用
1. ajax对xml的接收和处理 xml主要作用: 主要保存和传输数据 1. xml文档结构 dom操作xml getElementsByTagName(); //根据标签名获取元素 childNo ...
- 安装PostgreSQL数据库(Linux篇)
0.编译环境 Linux: CentOS 5.5 gcc: 4.1.2 1. 安装PostgreSQL 1) 解压postgresql-9.1.7.tar.bz2 #tar jxvf postgres ...
- rbenv更新ruby后rails命令无效的解决方案
创建: 2017/11/02 更新: 2018/02/02 增加rbenv使用方法的链接 rbenv的使用: http://www.cnblogs.com/lancgg/p/8281739.h ...
- 博客使用的CSS代码备份
CSS代码备份 /*simplememory*/ #google_ad_c1, #google_ad_c2 { display: none; } .syntaxhighlighter a, .synt ...
- FZU2277 Change(dfs序+树状数组)
传送门 题意 q次操作,操作有两种: 1 v x k:a[v]+=x,a[v']+=x-k(v'是v的子节点)... 2 v:查询\(a[v]mod(10^9+7)\) 分析 子节点增加的值为\(x+ ...
- .Net开发人员必备工具下载
.Net开发人员必备工具下载 本人亲测下载地址: Win8.1破解工具下载: http://pan.baidu.com/s/1eQf2UiQ 可激活版本 Windows Vista Busines ...
- laravel之Storage
学习laravel一段时间了,从最开始文件保存到本地直到oss都使用原生或接口.今天偶尔看到了Storage.正好项目中有用到就在项目上使用了. 1.下载安装库 composer require ja ...