uva 11419 SAM I AM

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

解题思路:König定理:最小覆盖数等于最大匹配数。把目标所在的坐标,转化为XY结点,行看成X结点,列看成Y结点。那现在问题就变成了,如何选最少的结点,覆盖所有的边。

求最小覆盖的步骤大致如下:1)在右边找到一个未被匹配过的点,标记。2)走一条没被匹配过的边,到左边的点,标记。3)走一条匹配过的边到右边,标记。4)重复2,3步骤直到不能再走。5)回到步骤一,直到找不到未被匹配且未被标记的右边的点。6)标记结束后,右边没有标记的点,和左边标记过的点,就可以覆盖所有的边。

想理解的更透彻,可以看这里。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <queue>
using namespace std;const int N = 1005;
typedef long long ll;
int n, m, k;
vector<int> X, Y;void init() {X.clear();Y.clear();
}struct BPM{  int n, m;  vector<int > G[N];  int left[N];  int right[N];  bool T[N];  bool S[N];  void init(int n,int m){  this->n = n;  this->m = m;  for(int i = 0; i < N; i++) G[i].clear();  }  void addEdge(int u, int v){  G[u].push_back(v);  //建边}  bool match(int u) {  S[u] = true; //标记右边的点ufor(int i = 0; i < G[u].size(); i++){ //遍历由u点出发,连接的左边的点 int v = G[u][i]; if(!T[v]){  //左边的没标记过的点, 走没匹配过的边T[v] = true;  if(left[v] == -1 || match(left[v])){ //走匹配过的边到右边的点left[v] = u;  right[u] = v;  return true;  }  }  }  return false;  }  int solve(){  memset(left, -1, sizeof(left));  memset(right, -1, sizeof(right));  int ans = 0;  for(int u = 0; u < n; u++){  memset(S, 0, sizeof(S));  memset(T, 0, sizeof(T));  if(match(u)) ans++;  //先用匈牙利算法求出最大匹配}  return ans;  }  int mincover(vector<int>& X, vector<int>& Y){  int ans = solve();  memset(S, 0, sizeof(S));  memset(T, 0, sizeof(T));  for(int u = 0; u < n; u++) //在右边的点集找到一个未被标记的点  if(right[u] == -1) match(u); //从这个未标记的点开始走增广路 for(int u = 0; u < n; u++)  if(!S[u]) X.push_back(u); //标记结束之后,记录右边没标记的点 for(int v = 0; v < n; v++)  if(T[v]) Y.push_back(v);  //记录左边标记过的点return ans;  }
}bpm;  void input() {int x, y;for (int i = 0; i < k; i++) {scanf("%d %d", &x, &y); x--, y--;bpm.addEdge(x, y);}
}int main() {while (scanf("%d %d %d", &n, &m, &k) == 3)  {if (!n && !m && !k) break;bpm.init(n, m);         init();input();printf("%d", bpm.mincover(X, Y));for (int i = 0; i < X.size(); i++) printf(" r%d", X[i] + 1);for (int i = 0; i < Y.size(); i++) printf(" c%d", Y[i] + 1);puts("");}return 0;
}

uva 11419 SAM I AM (最小覆盖 König定理)相关推荐

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

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

  2. UVa 11419 SAM I AM

    很神奇的方法--参悟中 1 /**/ 2 #include<iostream> 3 #include<cstdio> 4 #include<cmath> 5 #in ...

  3. 二分图最大匹配的König定理及其证明

    本文将是这一系列里最短的一篇,因为我只打算把König定理证了,其它的废话一概没有.     以下五个问题我可能会在以后的文章里说,如果你现在很想知道的话,网上去找找答案:     1. 什么是二分图 ...

  4. (转)二分图最大匹配的König定理及其证明

    出处:http://www.matrix67.com/blog/archives/116 二分图最大匹配的König定理及其证明 如果你看不清楚第二个字母,下面有一个大号字体版本: 二分图最大匹配的K ...

  5. 【转载】二分图最大匹配的König定理及其证明 Matrix67原创

    二分图最大匹配的König定理及其证明 本文将是这一系列里最短的一篇,因为我只打算把König定理证了,其它的废话一概没有. 以下五个问题我可能会在以后的文章里说,如果你现在很想知道的话,网上去找找答 ...

  6. 二分图最小点覆盖König定理的简单证明

    König定理是一个二分图中很重要的定理,它的意思是,一个二分图中的最大匹配数等于这个图中的最小点覆盖数.如果你还不知道什么是最小点覆盖,我也在这里说一下:假如选了一个点就相当于覆盖了以它为端点的所有 ...

  7. 【转载】二分图最大匹配的König定理及其证明

    二分图最大匹配的König定理及其证明 转载自 Matrix67 本文将是这一系列里最短的一篇,因为我只打算把König定理证了,其它的废话一概没有. 以下五个问题我可能会在以后的文章里说,如果你现在 ...

  8. 【二分图|最小点覆盖集】König定理及其证明

    转自Matrix67 二分图最大匹配的König定理及其证明 如果你看不清楚第二个字母,下面有一个大号字体版本: 二分图最大匹配的König定理及其证明 本文将是这一系列里最短的一篇,因为我只打算把K ...

  9. [匈牙利算法] 最小点覆盖 König定理

    König定理: 一个二分图中的最大匹配数等于这个图中的最小点覆盖数. (你都能用最少的覆盖最多的还不是最大匹配数??) poj 1325 Machine Schedule [题目描述]有两部机器A和 ...

最新文章

  1. @available 和 #available
  2. 轰动程序员圈的大事:女程序员将代码写到退休,返聘再续传奇
  3. Java TreeMap 源码解析
  4. 复杂数据权限设计方案
  5. Matlab 中prod函数的使用
  6. 北大开源分词工具包: 准确率远超THULAC、jieba 分词
  7. Python(6)-文件和异常
  8. IIS 6.0 SSL证书安装
  9. 猜算式,四个两位数字不可以重复(一)
  10. 学python有前途吗-2019年转行学Python有还前途吗?如何学习Python?
  11. 麦咖啡MACfEE服务器安全防护设置技巧!
  12. 有监督学习、无监督学习以及半监督学习详解
  13. 程序员真的是吃青春饭的吗?
  14. 实用android 代码,Android 实用代码七段(一)
  15. SUG 180 Inversions(树状数组+离散化)
  16. 我活成了自己曾经很鄙视的样子
  17. 计算机网络应用层之HTTP协议
  18. 【入门AUTOSAR网络管理测试】RMS-NOS状态转换
  19. 哈密顿量模拟(Hamiltonain simulation)
  20. 卷积神经网络(CNN)在语音识别中的应用

热门文章

  1. 菜鸟出海,能成功吗?
  2. Linux(Ubuntu 16.04)下非root用户编译安装Python 3.8.6
  3. DFX标准: GR-2841
  4. STP生成树协议详解
  5. 区块链将在元宇宙旅游中发挥哪些价值?
  6. 软考-挣值管理-挣值分析
  7. C语言怎么弄游戏的战场回放,c语言写的战争模拟游戏 源码
  8. 我国大数据产业链逐渐完善 区域发展集聚效应显现
  9. matlab机器人 联合ug仿真
  10. Git 详细教程之五:SSH 免密登陆 GitHub