题意:

     给你一个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的更多相关文章

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

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

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

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

  3. Uva 11419 我是SAM

    题目链接:https://vjudge.net/problem/UVA-11419 题意:一个网格里面有一些目标,可以从某一行,某一列发射一发子弹,可以打穿: 求最少的子弹,和在哪里打? 分析: 听说 ...

  4. 二分图&网络流初步

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

  5. TCP | 你真的懂 HTTP 吗?

    前言 Hello 大家好,我是 Sam Zhang. HTTP 相信是每个 Web 开发者都耳熟能详的名词了.但是,新手开发者想要完全理解 HTTP 协议却需要时间.这期视频,我就来带大家入门 HTT ...

  6. UVA11419 SAM I AM

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

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

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

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

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

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

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

随机推荐

  1. python inspect库

    一.介绍 inspect模块用于收集python对象的信息,可以获取类或函数的参数的信息,源码,解析堆栈,对对象进行类型检查等等. inspect模块主要提供了四种用处: 对是否是模块.框架.函数进行 ...

  2. 某SQL注入--报错注入payload

    1.证明存在sql注入,根据这个报错语句,,有'  有% 2.payload  闭合语句 %' or (select extractvalue("anything",concat( ...

  3. Hznu_0j 1533 计算球体积(水)

    题意:根据输入的半径值,计算球的体积: Input 输入数据有多组,每组占一行,每行包括一个实数,表示球的半径. Output 输出对应的球的体积,对于每组输入数据,输出一行,计算结果保留三位小数. ...

  4. TEB 、TIB、PEB--Vista 32

    TEB struct TEB typedef struct _TEB { NT_TIB NtTib; PVOID EnvironmentPointer; CLIENT_ID ClientId; PVO ...

  5. 【Azure 应用服务】App Service 在使用GIt本地部署,上传代码的路径为/home/site/repository,而不是站点的根目录/home/site/wwwroot。 这个是因为什么?

    问题描述 App Service 在使用GIt本地部署,上传代码的路径为/home/site/repository,而不是站点的根目录/home/site/wwwroot. 这个是因为什么? 并且通过 ...

  6. 【DB宝45】MySQL高可用之MGR+Consul架构部署

    目录 一.MGR+Consul架构简介 二.搭建MGR 2.1.申请3台MGR机器 2.2.3台主机安装MySQL环境 2.3.修改MySQL参数 2.4.重启MySQL环境 2.5.安装MGR插件( ...

  7. Android Studio 之 CheckBox

    •任务 •基本用法 CheckBox,复选框,即可以同时选中多个选项. 从网上找了三个图标,分别命名为 apple.jpg , banana.jpg , oranges.jpg 放置在了 drawab ...

  8. IT培训有哪些坑(二)?

    今天继续给大家分享一下IT培训都有哪些坑?有哪些不靠谱? 做招转的不靠谱.什么是招转?就是招聘转招生,名义上说的是招聘,但实际上做的就是招生.有很多大学刚毕业的计算机相关专业的同学,他们大学毕业之后, ...

  9. 一文读懂MySql主从复制机制

    作为一个关系型数据库,MySQL内建地提供数据复制机制,这使得在使用时,可以基于其复制机制实现高可用架构等高级特性,从而使得MySQL无需借助额外的插件或其他工具就具备适用于生产环境.这是MySQL得 ...

  10. Kubernetes中利用Kubectl set 让Deployment更新镜像

    问题描述 我的deployment有单个pod,我的自定义docker镜像如下: containers: - name: mycontainer image: myimage:latest 在开发过程 ...