UVA11419 SAM I AM
给定一个 \(R\times C\) 的矩阵中的 \(N\) 个点,求最少选取多少个行或列才能使得每个给出的点都被一行或一列覆盖,输出方案
\(R,\ C\leq10^3,\ N\leq10^6\)
网络流
易知原题即为建出二分图后跑最小点覆盖求方案
这里只是记录一下如何求方案……
找出从原点开始,只经过没被使用的边,构成的连通块
如果左侧节点没被包含在连通块中,输出方案
如果右侧节点被包含在连通块中,输出方案
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2010, inf = INT_MAX;
int R, C, N;
bool vis[maxn], isv[maxn];
int S, T, cnt, h[maxn], cur[maxn], dis[maxn];
struct edges {
int nxt, to, w;
edges(int x = 0, int y = 0, int z = 0) :
nxt(x), to(y), w(z) {}
} e[1010010];
void addline(int u, int v, int w) {
e[++cnt] = edges(h[u], v, w), h[u] = cnt;
e[++cnt] = edges(h[v], u, 0), h[v] = cnt;
}
bool bfs() {
static int Q[maxn];
memcpy(cur, h, sizeof h);
memset(dis, 0, sizeof dis);
int l = 1, r = 1;
Q[1] = S, dis[S] = 1;
while (l <= r) {
int u = Q[l++];
for (int i = h[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (e[i].w && !dis[v]) {
Q[++r] = v, dis[v] = dis[u] + 1;
if (v == T) return 1;
}
}
}
return 0;
}
int dfs(int u, int f) {
if (u == T || !f) {
return f;
}
int res = 0, tmp;
for (int& i = cur[u]; i && f; i = e[i].nxt) {
int v = e[i].to;
if (e[i].w && dis[v] == dis[u] + 1) {
if (!(tmp = dfs(v, min(f, e[i].w)))) {
dis[v] = 0; continue;
}
res += tmp, f -= tmp, e[i].w -= tmp, e[i ^ 1].w += tmp;
}
}
return res;
}
int dinic() {
int res = 0;
while (bfs()) {
res += dfs(S, inf);
}
return res;
}
void find(int u) {
vis[u] = 1;
for (int i = h[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (e[i].w && !vis[v]) find(v);
}
}
void solve() {
cnt = 1;
memset(h, 0, sizeof h);
memset(isv, 0, sizeof isv);
memset(vis, 0, sizeof vis);
S = R + C + 1, T = S + 1;
for (int i = 1; i <= R; i++) {
addline(S, i, 1);
}
for (int i = 1; i <= C; i++) {
addline(R + i, T, 1);
}
for (int i = 1, x, y; i <= N; i++) {
scanf("%d %d", &x, &y);
isv[x] = isv[R + y] = 1;
addline(x, R + y, 1);
}
printf("%d", dinic());
find(S);
for (int i = 1; i <= R; i++) {
if (isv[i] && !vis[i]) printf(" r%d", i);
}
for (int i = R + 1; i <= R + C; i++) {
if (isv[i] && vis[i]) printf(" c%d", i - R);
}
putchar(10);
}
int main() {
while (~scanf("%d %d %d", &R, &C, &N) && R && C && N) {
solve();
}
return 0;
}
UVA11419 SAM I AM的更多相关文章
- UVA11419 SAM I AM —— 最小点覆盖 + 输出覆盖点集
题目链接:https://vjudge.net/problem/UVA-11419 题解: 1.二分图匹配之最小点覆盖.:把x坐标和y坐标看成是点, 图中的目标看成是边,所以最终的目的是求出用最少的点 ...
- UVa11419 SAM I AM(构造最小点覆盖)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27475 [思路] 二分图的最小点覆盖以及构造最小覆盖. 二分图的最 ...
- UVA-11419 SAM I AM (最小点覆盖)
题目大意:在一个n*m的网格中,有k个目标,现在可以任选一行或列消除在其上的所有目标,求出最少选择次数及选法. 题目分析:经典的最小点覆盖问题,并且输出一个最小点覆盖集.在求出最大匹配之后,以未覆盖的 ...
- uva11419 二分图--最小覆盖=最大匹配
大白书355 // UVa11419 SAM I AM // Rujia Liu #include <cstdio> #include <cstring> #include & ...
- 二分图&网络流初步
链接 : 最小割&网络流应用 EK太低级了,不用. 那么请看:#6068. 「2017 山东一轮集训 Day4」棋盘,不用EK你试试? dinic模板及部分变形应用见zzz大佬的博客:网络流学 ...
- 【UVA11419 训练指南】我是SAM 【二分图最小覆盖,最小割】
题意 给出一个R*C大小的网格,网格上面放了一些目标.可以在网格外发射子弹,子弹会沿着垂直或者水平方向飞行,并且打掉飞行路径上的所有目标.你的任务是计算最少需要多少子弹,各从哪些位置发射,才能把所有目 ...
- UVA11419 我是SAM
题意: 给你一个n*m的矩阵,上面有一些格子上有目标,我们可以在格子的外面用枪打目标,一发子弹可以消灭一行或者一列目标,问你最少多少枪能把目标打光,并且输出开枪的位置,题目没说spj(特判) ...
- SAM I AM UVA - 11419 最小点集覆盖 要输出具体覆盖的行和列。
/** 题目:SAM I AM UVA - 11419 链接:https://vjudge.net/problem/UVA-11419 题意:给定n*n的矩阵,'X'表示障碍物,'.'表示空格;你有一 ...
- SAM初探
SAM,即Suffix Automaton,后缀自动机. 关于字符串有很多玩法,有很多算法都是围绕字符串展开的.为什么?我的理解是:相较于数字组成的序列,字母组成的序列中每个单位上元素的个数是有限的. ...
随机推荐
- rabbitmq消费者“无故消失”
hi,all 导读:9月1号17:12左右,发现影子队列存在大量“unacked”(收到了消息,但是还没有手动确认消息)的消息,一段时间后“unacked”的数量没有减少,但是观察消费者端的日志, ...
- Linux如何管理文档多租户
例题 同一群组microsoft下的两个账号justmine001和justmine002需要共同拥有目录/microsoft/eshop的开发权,以便进行协同工作,但是其他人不允许进入和查阅该目录. ...
- Python中星号的本质和使用方式
翻译:Python 开发者 - 一汀, 英文:Trey Hunner http://blog.jobbole.com/114655/ Python开发者 在 Python 中有很多地方可以看到*和** ...
- 解决MUI阻止a标签默认跳转事件—方法总结
用过mui的小伙伴们一定不会陌生,有时候真的很烦mui本身会阻止a标签默认跳转.一般只要用了mui的ui组件,比如头部,底部或者弹框,你就不能在用a标签进行跳转了. 注:项目中引用了mui后,可能也会 ...
- IIS系统短文件名漏洞猜解过程
今天看教程的时候,老师关于后台管理说到了短文件名漏洞,我就随便找了个网站猜解,可能是运气太好了,有了这次实践的过程,因为这个漏洞是13年的时候比较火,现在差不多都修复了,抓到一条漏网之鱼, 短文件名漏 ...
- 网络学习笔记(一):TCP连接的建立与关闭
五层网络模型分为:物理层.数据链路层.网络层.传输层.应用层.其中,传输层有两种主要协议:面向连接的TCP(Transmission Control Protocol 传输控制协议).无连接的UD ...
- (五)surging 微服务框架使用系列之缓存-reids
1.服务跟客户端初始化的时候需要添加缓存配置 var host = new ServiceHostBuilder() .RegisterServices(builder => { builder ...
- jQuery(三)、属性、CSS
jQuery设置了很多为标签进行属性的操作,比如添加.删除. 一 .属性 1 attr(name | properties | [key, value | fn]) 设置或返回被选择的属性值. 参数: ...
- glibc溢出提权CVE-2018-1000001总结
遇到了好几个centos6.5,一直尝试想提权.暂未成功,靶机内核:2.6.32-696.18.7.el6.x86_64. glibc版本:ldd (GNU libc) 2.12 目前编译过程中都发现 ...
- ES6基础
一.新增命令let/const ①:let命令 1.let命令用来声明变量,它的用法类似于var,但是所声明的变量只在let命令所在的代码块内生效. 所以在for循环中,就很适合使用let命令. 上面 ...