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,后缀自动机. 关于字符串有很多玩法,有很多算法都是围绕字符串展开的.为什么?我的理解是:相较于数字组成的序列,字母组成的序列中每个单位上元素的个数是有限的. ...
随机推荐
- 如何在eclipse中快速debug到想要的参数条件场景下
前言 俗话说,工欲善其事必先利其器. 对于我们经常使用的开发工具多一些了解,这也是对我们自己工作效率的一种提升. 场景 作为开发,我们经常会遇到各种bug,大部分的bug很明确,我们直接可以打断点定位 ...
- 蓝牙协议中的SBC编解码原理和仿真
一.SBC的原理 SBC是subband codec的缩写,中文叫做次频带编码,也叫子带编码.其基本原理是把信号的频率分为若干子带,然后对每个子带进行编码,并根据每个子带的重要性及特点分配不同的位数( ...
- java常用API的总结(1)
本篇是对于这一段时间以来接触到的常用api的一些总结,便于以后的查阅.... 一.正则表达式 对于正则表达式,我的感觉就是当我们在做某些题的时候正则表达式会省去我们很多的时间,并且正则表达式的使用格式 ...
- Docker & ASP.NET Core (5):Docker Compose
第一篇:把代码连接到容器 第二篇:定制Docker镜像 第三篇:发布镜像 第四篇:容器间的连接 Docker Compose简介 Compose是一个用来定义和运行多容器Docker应用的工具.使用C ...
- Spring Cloud微服务系列文,服务调用框架Feign
之前博文的案例中,我们是通过RestTemplate来调用服务,而Feign框架则在此基础上做了一层封装,比如,可以通过注解等方式来绑定参数,或者以声明的方式来指定请求返回类型是JSON. 这种 ...
- 从零开始学习PYTHON3讲义(十六)(连载完)学习资源包下载
<从零开始PYTHON3>学习资源包下载 课程连载已经完全结束. 经过整理校对,这里把在课程中出现过的源码和练习答案示例源码全部打包提供下载: https://pan.baidu.com/ ...
- springboot~configserver里对重要信息进行RSA加密
简介 参考:https://springcloud.cc/spring-cloud-dalston.html#_encryption_and_decryption_2 RSA非对称加密有着非常强大的安 ...
- Python:bs4的使用
概述 bs4 全名 BeautifulSoup,是编写 python 爬虫常用库之一,主要用来解析 html 标签. 一.初始化 from bs4 import BeautifulSoup soup ...
- OpenCV 初体验
个人博客原文链接 个人掘金链接 本文简单地介绍计算机图形处理的一些基本概念,以及一些有趣的例子和对应的Open CV的代码操作. 顺便说一句,恭喜IG夺冠! 一.图片存储原理 1.颜色空间RGB (1 ...
- DSAPI 3张图片实现花开动画
效果图 素材 代码 Dim B0, B1, B3 As Bitmap Private B As Bitmap = Nothing Private Sub Loading_Load(sender As ...