UVA11419 我是SAM
题意:
给你一个n*m的矩阵,上面有一些格子上有目标,我们可以在格子的外面用枪打目标,一发子弹可以消灭一行或者一列目标,问你最少多少枪能把目标打光,并且输出开枪的位置,题目没说spj(特判),但显然是特判。
思路:
求最少多少枪好办,就是求最小顶点覆盖,这个大家都知道,关键是求方案,白书上当时说的是什么匈牙利树,表示没听过,没办法,愣是在网上找到一个代码不停的模拟那个所谓匈牙利树什么的过程,现在我说下我的理解:
我们要处理的其实就是这样两种情况的各种组合。
(1)
这个显然是在左边2行开枪
(2)
这个显然是在右边2行开枪
那么遇到这样的一个个组合我们怎么找呢?我们可以利用匈牙利算法的性质,我们在左侧没有匹配的行让他继续匹配,匹配尝试中,凡是能设计到左边的点都mark上,mark上的点就是不用开枪的点,凡是设计到的又边的点也mark上,mark上的点都是能开枪的点,只要你了解匈牙利的过程,这个很容易理解,建议自己模拟下,迷茫的时候模拟是最快的学习方法。
具体细节看下代码吧!比较容易理解。
#include<stdio.h>
#include<string.h>
#define N_node 1000 + 10
#define N_edge 1000000 + 10
typedef struct
{
int to ,next;
}STAR;
STAR E[N_edge];
int list[N_node] ,tot;
int mk_gxl[N_node] ,mk_gxr[N_node];
int mkl[N_node] ,mkr[N_node];
void add(int a, int b)
{
E[++tot].to = b;
E[tot].next = list[a];
list[a] = tot;
}
int DFS_XYL(int x)
{
mkl[x] = 1;
for(int k = list[x] ;k ;k = E[k].next)
{
int to = E[k].to;
if(mkr[to]) continue;
mkr[to] = 1;
if(mk_gxr[to] == -1 || DFS_XYL(mk_gxr[to]))
{
mk_gxr[to] = x;
mk_gxl[x] = to;
return 1;
}
}
return 0;
}
int main ()
{
int R ,C ,i ,Ans ,n ,a ,b;
while(~scanf("%d %d %d" ,&R ,&C ,&n) && R + C + n)
{
memset(list ,0 ,sizeof(list)) ,tot = 1;
for(i = 1 ;i <= n ;i ++)
{
scanf("%d %d" ,&a ,&b);
add(a ,b);
}
Ans = 0;
memset(mk_gxl ,255 ,sizeof(mk_gxl));
memset(mk_gxr ,255 ,sizeof(mk_gxr));
for(i = 1 ;i <= R ;i ++)
{
memset(mkr ,0 ,sizeof(mkr));
Ans += DFS_XYL(i);
}
printf("%d" ,Ans);
memset(mkr ,0 ,sizeof(mkr));
memset(mkl ,0 ,sizeof(mkl));
for(i = 1 ;i <= R ;i ++)
if(mk_gxl[i] == -1) DFS_XYL(i);
for(i = 1 ;i <= R ;i ++)
if(!mkl[i]) printf(" r%d" ,i);
for(i = 1 ;i <= C ;i ++)
if(mkr[i]) printf(" c%d" ,i);
printf("\n");
}
return 0;
}
UVA11419 我是SAM的更多相关文章
- 【UVA11419 训练指南】我是SAM 【二分图最小覆盖,最小割】
题意 给出一个R*C大小的网格,网格上面放了一些目标.可以在网格外发射子弹,子弹会沿着垂直或者水平方向飞行,并且打掉飞行路径上的所有目标.你的任务是计算最少需要多少子弹,各从哪些位置发射,才能把所有目 ...
- UVa 11419 我是SAM(最小点覆盖+路径输出)
https://vjudge.net/problem/UVA-11419 题意:一个网格里面有一些目标,可以从某一行,某一列发射一发子弹,可以打掉它:求最少的子弹,和在哪里打? 思路: 每个点的x坐标 ...
- Uva 11419 我是SAM
题目链接:https://vjudge.net/problem/UVA-11419 题意:一个网格里面有一些目标,可以从某一行,某一列发射一发子弹,可以打穿: 求最少的子弹,和在哪里打? 分析: 听说 ...
- 二分图&网络流初步
链接 : 最小割&网络流应用 EK太低级了,不用. 那么请看:#6068. 「2017 山东一轮集训 Day4」棋盘,不用EK你试试? dinic模板及部分变形应用见zzz大佬的博客:网络流学 ...
- TCP | 你真的懂 HTTP 吗?
前言 Hello 大家好,我是 Sam Zhang. HTTP 相信是每个 Web 开发者都耳熟能详的名词了.但是,新手开发者想要完全理解 HTTP 协议却需要时间.这期视频,我就来带大家入门 HTT ...
- UVA11419 SAM I AM
UVA11419 SAM I AM 给定一个 \(R\times C\) 的矩阵中的 \(N\) 个点,求最少选取多少个行或列才能使得每个给出的点都被一行或一列覆盖,输出方案 \(R,\ C\leq1 ...
- 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个目标,现在可以任选一行或列消除在其上的所有目标,求出最少选择次数及选法. 题目分析:经典的最小点覆盖问题,并且输出一个最小点覆盖集.在求出最大匹配之后,以未覆盖的 ...
随机推荐
- 【java框架】MyBatis(7)--MyBatis注解开发
1.MyBatis注解开发 1.1.Lombok的基本使用 Lombok是SpringBoot2.1.X版本与IDEA官方支持的一个插件,它是为简化POJO类中繁杂重复代码:geter/setter/ ...
- 运用arcgis将标签图片(栅格图)转换为shp矢量文件
最近在做图像分割校正,需要将ecognition分割好的shp文件做优化,但是如果直接对shp文件修改非常不友好,可以先对导出的tif标签图进行修改,然后将修改后的标签图转换为新的shp文件进行输出. ...
- 使用quartz.net 完成一个winform版的任务提醒工具
这个任务提醒工具是这样的,是每日定时执行,触发时间为 小时和分钟.每天早上来就可以把当天要做的添加到datagridview中,只记录了标题和内容和时间.双击dgv就查看内容. 如果每天计划重复,也可 ...
- ES6学习笔记(1)- 块级作用域
1. var声明变量和变量提升(Hoisting)机制的问题 在JS中通过var关键字声明的变量,无论在函数作用域中亦或是全局作用域中,都会被当成当前作用域顶部的变量,和就是所谓的提升机制(Hoist ...
- springcloud知识点总结
一.SpringCloud面试题口述1.SpringCloud和DubboSpringCloud和Dubbo都是现在主流的微服务架构SpringCloud是Apache旗下的Spring体系下的微服务 ...
- 记一次scrapy-redis爬取小说网的分布式搭建过程
scrapy-redis简介 scrapy-redis是scrapy框架基于redis数据库的组件,用于scrapy项目的分布式开发和部署. 有如下特征: 分布式爬取 可以启动多个spider工程,相 ...
- python graphviz的使用(画图工具)
参考文章1 参考文章2 一.graphviz安装及配置 graphviz实际上是一个绘图工具,可以根据dot脚本画出树形图等. 1.windows安装 安装graphviz软件:https://gra ...
- Excel模板导出之动态导出
说明 目前Magicodes.IE已支持Excel模板导出时使用JObject.Dictionary和ExpandoObject来进行动态导出,具体使用请看本篇教程. 本功能的想法.部分实现初步源于a ...
- 在ASP.NET Core中用HttpClient(六)——ASP.NET Core中使用HttpClientFactory
到目前为止,我们一直直接使用HttpClient.在每个服务中,我们都创建了一个HttpClient实例和所有必需的配置.这会导致了重复代码.在这篇文章中,我们将学习如何通过使用HttpClient ...
- 「HTML+CSS」--自定义按钮样式【004】
前言 Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 哈哈 自我介绍一下 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入计算机 ...