参考博客:如何找取 最小覆盖点集合

题意:R*C大小的网格,网格上面放了一些目标。可以再网格外发射子弹,子弹会沿着垂直或者水平方向飞行,并且打掉飞行路径上的所有目标,计算最小多少子弹,各从哪些位置发射,才能将所有的目标全部打掉

分析:就是求最小覆盖点 以及 输出所有的覆盖点

最小覆盖点 == 最大匹配数

个人理解:

最大匹配数是用匈牙利算法求的,就是从左边一个点开始找到他看上的那个妹纸,如果那个妹纸已经名花有有主就跟那个男生换一个...沿着 ( 没匹配 - 匹配边 -... - 没匹配边)  这样的增广路径来探寻。

假设已经求得最大匹配,怎么证明最大匹配等于最小覆盖点呢, 首先从左边没有匹配上的边开始 找增光路,找到所有的点都标记一下,当然不会找到一个全的,如果全的话就不是最大匹配,又多出来一个匹配边。  那么最小覆盖点就是 左边 没标记 + 右边标记的, 为什么呢? 对于左边没标记的 也就是说他有 匹配边 同时与他相连的右边那个点 没被标记,(如果右边标记, 他就被标记了),所有左边 所有没标记的点 是 最大匹配边的一部分 , 然后右边标记的呢,从左边没标记点开始连向右边的点,右边的这个点一定被匹配上了的,右边标记的点也是匹配边的一个端点,组成了 最大匹配边的那一部分,  说白点就是 左边没标记的匹配边 就是这两个点就是相互喜欢型的,而右边标记的就是有别人暗恋的。

 #include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
const int Max = + ;
int n, m;
vector<int> G[Max];
int Left[Max], Right[Max]; // left[i]表示右边的i对应左边的编号,right[i]表示左边的i对应右边的编号
bool vis[Max]; // 右边的点有没有访问
bool S[Max]; // 左边的点有没有没标记
void init()
{
for (int i = ; i < n; i++)
G[i].clear();
}
void addedge(int u, int v)
{
G[u].push_back(v);
}
bool mach(int u)
{
S[u] = true;
int len = (int) G[u].size();
for (int i = ; i < len; i++)
{
int v = G[u][i];
if (!vis[v])
{
vis[v] = true;
if (Left[v] == - || mach(Left[v]))
{
Left[v] = u; // 存储匹配关系
Right[u] = v;
return true;
}
}
}
return false;
}
int solve()
{
memset(Left, -, sizeof(Left));
memset(Right, -, sizeof(Right));
int ans = ;
for (int i = ; i < n; i++)
{
memset(vis, , sizeof(vis));
if (mach(i))
ans++;
}
return ans;
}
int mincover(vector<int> & X, vector<int> & Y)
{
int ans = solve();
memset(vis, , sizeof(vis));
memset(S, , sizeof(S));
for (int i = ; i < n; i++)
{
if (Right[i] == -) // 从左边没有匹配的点开始找增广路
mach(i);
}
for (int i = ; i < n; i++)
if (!S[i]) // 左边没标记
X.push_back(i);
for (int i = ; i < m; i++)
if (vis[i]) // 右边标记的
Y.push_back(i);
return ans;
}
int main()
{
int c, r, N;
while (scanf("%d%d%d", &n, &m, & N) != EOF)
{
if (n == && m == && N == )
break;
init();
for (int i = ; i < N; i++)
{
scanf("%d%d", &r, &c);
r--;
c--;
addedge(r, c);
}
vector<int> X, Y;
int ans = mincover(X, Y);
printf("%d", ans);
for (int i = ; i < (int) X.size(); i++)
printf(" r%d", X[i] + );
for (int j = ; j < (int) Y.size(); j++)
printf(" c%d", Y[j] + );
printf("\n");
} return ;
}

UVA 11419SAM I AM(输出 最小覆盖点 )的更多相关文章

  1. UVA 624CD(01背包输出 + 输出路径)

    You have a long drive by car ahead. You have a tape recorder, but unfortunately your best music is o ...

  2. 紫书 例题 9-10 UVa 1626 (区间dp + 输出技巧)

    当前区间f(i, j)分两种情况,一种是s[i]于s[j]符合要求,那么可以转移到f[i + 1][j - 1] 这样答案只会更小或者相等 第二种是直接分成两个部分, 即f[i][j] = f[i][ ...

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

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

  4. B - Letter(最小覆盖矩形)

    Problem description A boy Bob likes to draw. Not long ago he bought a rectangular graph (checked) sh ...

  5. Jessica's Reading Problem POJ - 3320(尺取法2)

    题意:n页书,然后n个数表示各个知识点ai,然后,输出最小覆盖的页数. #include<iostream> #include<cstdio> #include<set& ...

  6. 题解:UVA10791 Minimum Sum LCM

    原题 题目大意 输入整数\(n(1\le n<2^{31})\) ,求至少两个正整数,是它们的最小公倍数为$ n$,且这些整数的和最小.输出最小的和. 有多组测试输入,以\(0\)结束. 题解 ...

  7. 矩阵乘法优化DP复习

    前言 最近做毒瘤做多了--联赛难度的东西也该复习复习了. Warning:本文较长,难度分界线在"中场休息"部分,如果只想看普及难度的可以从第五部分直接到注意事项qwq 文中用(比 ...

  8. UVa 11419 我是SAM(最小点覆盖+路径输出)

    https://vjudge.net/problem/UVA-11419 题意:一个网格里面有一些目标,可以从某一行,某一列发射一发子弹,可以打掉它:求最少的子弹,和在哪里打? 思路: 每个点的x坐标 ...

  9. SAM I AM UVA - 11419(最小顶点覆盖+输出一组解)

    就是棋盘问题输出一组解 https://blog.csdn.net/llx523113241/article/details/47759745 http://www.matrix67.com/blog ...

随机推荐

  1. mac下CornerstoneSVN出错 Description : The working copy is locked due to a previous error

    使用CornerStone工具update最新SVN代码报错:The working copy is locked due to a previous error,不仅无法上传,也无法更新,错误提示被 ...

  2. 抛开react,如何理解virtual dom和immutability

    去年以来,React的出现为前端框架设计和编程模式吹来了一阵春风.很多概念,无论是原本已有的.还是由React首先提出的,都因为React的流行而倍受关注,成为大家研究和学习的热点.本篇分享主要就聚焦 ...

  3. 【python游戏编程之旅】第七篇---pygame中的冲突检测技术

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 上一个博客我们一起学习了pygame中的Sprite模块和如何加载动画:http://www.cnblogs ...

  4. C语言之Sleep函数

    Sleep函数: 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned seconds); 注意: 在VC中使用带上头文件#include <windows.h& ...

  5. <html>中的action

    现在发现html中的许多标签都具有重要属性,而且这些属性是需要用于数据的传输的,虽然说html着重在于数据的显示,但是 在浏览器与服务器之间的交互,需要有数据参与传输,而数据传输的标准,就依赖于htm ...

  6. MyBatis_Generator的使用(实践)

    使用MyBatis的Generator主要配置三个地方 1.pom.xml 2.generatorConfig.xml 3.maven命令生成文件 一.pom.xml 1.引入依赖 <mysql ...

  7. flex布局知识点

    flexBox 布局最合适小规模布局,而网格布局适合较大规模布局. float,clear,vertical-align  在flex中不起作用. flex布局中,有两类作用于父节点也子节点的样式,大 ...

  8. swift 学习(三)(面向对象基础)

    面向对象的基本特征包括:封装,继承,多态 在swift中,类,结构,枚举都具有面向对象特性 但结构和枚举的实例不称为对象,因为结构和枚举不是彻底的面向对象类型,比如他们不能继承. 结构体 struct ...

  9. 利用MVC的自定义过滤器FilterAttribute、IActionFilter、IExceptionFilter实现异常处理等功能

    今天在博客园上看了一篇推荐文章,还说得蛮有道理: http://www.cnblogs.com/richieyang/p/4779028.html 项目中确实有各种后台验证过程,最常见的莫过于判空,而 ...

  10. Maven-setting.xml详解

    settings.xml对于maven来说相当于全局性的配置,用于所有的项目,当Maven运行过程中的各种配置,例如pom.xml,不想绑定到一个固定的project或者要分配给用户时,我们使用set ...