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的更多相关文章

  1. UVA11419 SAM I AM —— 最小点覆盖 + 输出覆盖点集

    题目链接:https://vjudge.net/problem/UVA-11419 题解: 1.二分图匹配之最小点覆盖.:把x坐标和y坐标看成是点, 图中的目标看成是边,所以最终的目的是求出用最少的点 ...

  2. UVa11419 SAM I AM(构造最小点覆盖)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27475 [思路] 二分图的最小点覆盖以及构造最小覆盖. 二分图的最 ...

  3. UVA-11419 SAM I AM (最小点覆盖)

    题目大意:在一个n*m的网格中,有k个目标,现在可以任选一行或列消除在其上的所有目标,求出最少选择次数及选法. 题目分析:经典的最小点覆盖问题,并且输出一个最小点覆盖集.在求出最大匹配之后,以未覆盖的 ...

  4. uva11419 二分图--最小覆盖=最大匹配

    大白书355 // UVa11419 SAM I AM // Rujia Liu #include <cstdio> #include <cstring> #include & ...

  5. 二分图&网络流初步

    链接 : 最小割&网络流应用 EK太低级了,不用. 那么请看:#6068. 「2017 山东一轮集训 Day4」棋盘,不用EK你试试? dinic模板及部分变形应用见zzz大佬的博客:网络流学 ...

  6. 【UVA11419 训练指南】我是SAM 【二分图最小覆盖,最小割】

    题意 给出一个R*C大小的网格,网格上面放了一些目标.可以在网格外发射子弹,子弹会沿着垂直或者水平方向飞行,并且打掉飞行路径上的所有目标.你的任务是计算最少需要多少子弹,各从哪些位置发射,才能把所有目 ...

  7. UVA11419 我是SAM

    题意:      给你一个n*m的矩阵,上面有一些格子上有目标,我们可以在格子的外面用枪打目标,一发子弹可以消灭一行或者一列目标,问你最少多少枪能把目标打光,并且输出开枪的位置,题目没说spj(特判) ...

  8. SAM I AM UVA - 11419 最小点集覆盖 要输出具体覆盖的行和列。

    /** 题目:SAM I AM UVA - 11419 链接:https://vjudge.net/problem/UVA-11419 题意:给定n*n的矩阵,'X'表示障碍物,'.'表示空格;你有一 ...

  9. SAM初探

    SAM,即Suffix Automaton,后缀自动机. 关于字符串有很多玩法,有很多算法都是围绕字符串展开的.为什么?我的理解是:相较于数字组成的序列,字母组成的序列中每个单位上元素的个数是有限的. ...

随机推荐

  1. 宝塔面板设置腾迅COS自动备份网站

    之前写了如何配置腾迅云COS并挂载到服务器中,今天看到宝塔面板中有腾迅云COS的插件,不过研究了下,只是将COS绑定在宝塔面板中,不能自动备份,需要用到宝塔的计划任务功能 1.下载腾迅云COS插件 2 ...

  2. 来一波C#发送邮件

    1.所用工具和资源:VS2012   在.NET Frameword类库中提供SmtpClient类(System.NET.Mail) 2.运行截图 3.具体代码实现如下: using System; ...

  3. Vue.js-01:第一章 - 一些基础概念

    一.前言 Vue.React.Angular,当今前端界的三驾马车,作为传统的后端程序员,前端再也不是我们想的那种切切图就可以了,第一次接触的话,先了解了解一些基础的概念. 学习系列目录地址:http ...

  4. Python中路径操作

    目录 1. os.path模块 2. pathlib模块 2.1 目录操作 2.2 文件操作 3. shutil模块 3.1 os模块 3.2 shutil模块 1. os.path模块 3.4版本之 ...

  5. 【重学计算机】机组D6章:中央处理器

    1. CPU的组成与功能 2. 数据通路 概念:执行部件间传送信息的路径,分共享通路(总线)和专用通路 抽象模型:时钟驱动下,A --> 组合逻辑 --> B D触发器定时模型: 时钟触发 ...

  6. 带你找到五一最省的旅游路线【dijkstra算法代码实现】

    算法推导过程参见[dijkstra算法推导详解] 此文为[dijkstra算法代码实现] https://www.cnblogs.com/Halburt/p/10767389.html package ...

  7. 【大数据安全】Kerberos集群安装配置

    1. 概述 Kerberos是一种计算机网络认证协议,它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份.它也指由麻省理工实现此协议,并发布的一套免费软件.它的设计主要针对 ...

  8. Spring学习(零):我们为什么要学习Spring

    序言 通过使用Spring的IoC容器,可以对这些耦合关系(对Java代码而言)实现一个简单的文本化的操作:即是说通过一个或几个XML文文件,我们就可以方便的对应用对象的耦合关系进行浏览.修改和维护, ...

  9. 筛选出和该元素相交的元素之BoundingBoxIntersectsFilter

    //假设元素为ee BoundingBoxXYZ box = ee.get_BoundingBox(doc.ActiveView); //创建outline,通过boundingboxintersec ...

  10. .NET Framework框架介绍

    1.内容 .net framework c#和.net关系 掌握C#中命名空间2..net 就是微软提供的一个开发平台 版本: vs2008 3.5 vs2010 4.0 vs2012 2013 20 ...