题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27475

【思路】

  二分图的最小点覆盖以及构造最小覆盖。

  二分图的最小点覆盖即在二分图中选出最少的点使能够将所有的边覆盖。构造思路是从所有未盖点出发拓展匈牙利树,X中的未标记点与Y中的已标记点为最小覆盖集。

  具体可见:http://www.tuicool.com/articles/jmAnEb

【代码】

#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>
using namespace std; const int maxn = 1000+10; bool S[maxn],T[maxn];
int lky[maxn],lkx[maxn];
vector<int> G[maxn]; bool match(int u) {
S[u]=1;
for(int i=0;i<G[u].size();i++) {
int v=G[u][i];
if(!T[v]) {
T[v]=1;
if(!lky[v] || match(lky[v])) {
lky[v]=u , lkx[u]=v;
return true;
}
}
}
return false;
} int n,m,k; void read(int& x) {
char c=getchar();
while(!isdigit(c)) c=getchar();
x=0;
while(isdigit(c)) {
x=x*10+c-'0' , c=getchar();
}
} int main() {
while(scanf("%d%d%d",&n,&m,&k)==3 &&(n)) {
for(int i=1;i<=n;i++) G[i].clear();
int u,v;
for(int i=0;i<k;i++) {
read(u),read(v);
G[u].push_back(v);
}
memset(lky,0,sizeof(lky));
memset(lkx,0,sizeof(lkx));
int ans=0;
for(int i=1;i<=n;i++) {
memset(T,0,sizeof(T));
memset(S,0,sizeof(S));
if(match(i)) ans++;
}
printf("%d ",ans);
memset(S,0,sizeof(S));
memset(T,0,sizeof(T));
for(int i=1;i<=n;i++)
if(!lkx[i]) match(i);
for(int i=1;i<=n;i++)
if(!S[i]) printf("r%d ",i);
for(int i=1;i<=n;i++)
if(T[i]) printf("c%d ",i);
putchar('\n');
}
return 0;
}

UVa11419 SAM I AM(构造最小点覆盖)的更多相关文章

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

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

  2. UVA 11419 SAM I AM (最小点覆盖,匈牙利算法)

    题意:给一个r*c的矩阵,某些格子中可能有一些怪物,可以在一行或一列防止一枚大炮,大炮会扫光整行/列的怪,问最少需要多少炮?输出炮的位置. 思路: 先每行和列都放一个炮,把炮当成点,把怪当成边,一边连 ...

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

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

  4. UVA 11419 SAM I AM(最大二分匹配&最小点覆盖:König定理)

    题意:在方格图上打小怪,每次可以清除一整行或一整列的小怪,问最少的步数是多少,又应该在哪些位置操作(对输出顺序没有要求). 分析:最小覆盖问题 这是一种在方格图上建立的模型:令S集表示“行”,T集表示 ...

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

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

  6. 二分图最小点覆盖构造方案+König定理证明

    前言 博主很笨 ,如有纰漏,欢迎在评论区指出讨论. 二分图的最大匹配使用 \(Dinic\) 算法进行实现,时间复杂度为 \(O(n\sqrt{e})\),其中, \(n\)为二分图中左部点的数量, ...

  7. UVA11419 SAM I AM

    UVA11419 SAM I AM 给定一个 \(R\times C\) 的矩阵中的 \(N\) 个点,求最少选取多少个行或列才能使得每个给出的点都被一行或一列覆盖,输出方案 \(R,\ C\leq1 ...

  8. Ex 6_21 最小点覆盖问题_第八次作业

    子问题定义: 对于图中的每个结点,有两种状态,即属于最小点覆盖和不属于最小点覆盖,定义minSet[i][0]表示结点i属于点覆盖,并且以i为根的树的最小点覆盖的大小.minSet[i][1]表示点i ...

  9. ACM/ICPC 之 机器调度-匈牙利算法解最小点覆盖集(DFS)(POJ1325)

    //匈牙利算法-DFS //求最小点覆盖集 == 求最大匹配 //Time:0Ms Memory:208K #include<iostream> #include<cstring&g ...

随机推荐

  1. struts_ognl详解

  2. android EventBus 的使用

    今天简单的介绍 一下啊 android  EventBus 的使用 EventBus 在官方介绍中是订阅......什么的 一大堆  ,  在我android 菜鸟眼里 就是用来代替android 广 ...

  3. CentOS 6.5 64位,调整分区大小

    调整硬盘分区大小 想增加root空间,减少home空间. 1.查看硬盘使用情况. [root@npm ~]# df -h Filesystem Size Used Avail Use% Mounted ...

  4. Javascript的AMD规范

    Javascript发展到今天,已经从一个小丑语言变成了不可替代的前端利器,已经脱离了低端的玩笑脚步,而转变为有规可依的强大语言. 本文主要讲述下如今被大力推广的AMD规范,为什么要AMD,什么场景是 ...

  5. SGU 190.Dominoes(二分图匹配)

    时间限制:0.25s 空间限制:4M 题意: 给定一个N*N的棋盘,一些格子被移除,在棋盘上放置一些1*2的骨牌,判定能否放满,并且输出任意方案. Solution: 首先考虑对棋盘的一个格子黑白染色 ...

  6. 了解负载均衡 会话保持 session同步(转)

    一,什么负载均衡 一个新网站是不要做负载均衡的,因为访问量不大,流量也不大,所以没有必要搞这些东西.但是随着网站访问量和流量的快速增长,单台服务器受自身硬件条件的限制,很难承受这么大的访问量.在这种情 ...

  7. TestNG Listener

    常用接口 IExecutionListener   监听TestNG运行的启动和停止. IAnnotationTransformer 注解转换器,用于TestNG测试类中的注解. ISuiteList ...

  8. JS作用域概念-预解析规则

    // 作用域: // 域:空间.范围.区域…… // 作用:读.写 script 全局变量.全局函数 自上而下 函数 由里到外 {} 浏览器: “JS解析器” 1)“找一些东西” :var funct ...

  9. 使用$.getJSON实现跨域ajax请求

    jQuery中常用getJSON来调用并获取远程的JSON字符串,将其转换为JSON对象,如果成功,则执行回调函数.原型如下: jQuery.getJSON( url, [data], [callba ...

  10. Android 中文 API (29) —— CompoundButton

    前言 本章内容是android.widget.CompoundButton,翻译来自德罗德,再次感谢德罗德 !期待你一起参与Android API 的中文翻译,联系我over140@gmail.com ...