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,后缀自动机. 关于字符串有很多玩法,有很多算法都是围绕字符串展开的.为什么?我的理解是:相较于数字组成的序列,字母组成的序列中每个单位上元素的个数是有限的. ...
随机推荐
- git命令设置
初始化为git项目: cd .../project //切换到项目目录下 git init //把project初始化为git项目 git remote add origin https://gi ...
- SUSE12SP3-Mycat(3)Server.xml配置详解
简介 server.xml 几乎保存了所有 mycat 需要的系统配置信息.其在代码内直接的映射类为 SystemConfig 类. user 标签 <user name="test& ...
- Python爬虫入门教程 51-100 Python3爬虫通过m3u8文件下载ts视频-Python爬虫6操作
什么是m3u8文件 M3U8文件是指UTF-8编码格式的M3U文件. M3U文件是记录了一个索引纯文本文件, 打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放. ...
- 让你的ASP.NET Core应用程序更安全
让你的ASP.NET Core应用程序更安全 对于ASP.NET Core应用程序,除了提供认证和授权机制来保证服务的安全性,还需要考虑下面的一些安全因素: CSRF 强制HTTPS 安全的HTTP ...
- WebApiClient的接口输入验证
1. 文章目的 随着WebApiClient的不断完善,越来越多开发者选择WebApiClient替换原生的HttpClient,本文将介绍WebApiClient的接口参数输入有效性验证的新特性. ...
- PyTorch入门(一)向量
什么是PyTorch? PyTorch是Facebook人工智能团队开发的一个机器学习和深度学习工具,用于处理大规模图像分析,包括物体检测,分割与分类.但是它的功能不仅限于此.它与其它深度学习框架 ...
- Rekit
本文转自:http://rekit.js.org/docs/get-started.html Get started The easiest way to try out Rekit is creat ...
- 数据结构——Java实现顺序表
一.分析 什么是顺序表?顺序表是指用一组地址连续的存储单元依次存储各个元素,使得在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中的线性表.一个标准的顺序表需要实现以下基本操作: 1.初始化顺序表 ...
- jsp内置对象-response对象
一.概念 隐含对象response是javax.servlet.HttpServletResponse接口实现类的对象.response对象封装了JSP产生的响应,用于响应客户端的请求,向客户端输出信 ...
- CSS 三条横线等分
.header_qian { width: 1.5rem; height: 1.5rem; background: rgba(250, 250, 250,0.7); border-radius: 50 ...