题意:求最少的线可以覆盖一个由0、1两种数字组成的图中所有的1。

eg:

只需要两条线即可。

分析:

1、先为上述例子的行列标号

2、若图中数字为1,则代表该数字所在的行与列有关联。

例如第r1行第c3列的数字1,可以看成r1和c3为两个点,因为此处是数字1,所以这两个点之间可以连1条线

3、所以可转化为如下的二分图

4、可以简单的理解为只要图中某个位置是数字1,就可以连一条线,线的两个端点是行号和列号。

5、因此本题就转化为了,求能覆盖所有边的最少的点数

6、由上图易知,r2和c3两个点就可以覆盖所有的边,回到原题就是只要在第r2行和第c3列画上线即可覆盖所有的1

7、由二分图的性质可知,最小匹配数等于最大点覆盖数,因此用匈牙利算法求解。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cstdlib>
  4. #include<cctype>
  5. #include<cmath>
  6. #include<iostream>
  7. #include<sstream>
  8. #include<iterator>
  9. #include<algorithm>
  10. #include<string>
  11. #include<vector>
  12. #include<set>
  13. #include<map>
  14. #include<stack>
  15. #include<deque>
  16. #include<queue>
  17. #include<list>
  18. #define Min(a, b) a < b ? a : b
  19. #define Max(a, b) a < b ? b : a
  20. typedef long long ll;
  21. typedef unsigned long long llu;
  22. const int INT_INF = 0x3f3f3f3f;
  23. const int INT_M_INF = 0x7f7f7f7f;
  24. const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
  25. const ll LL_M_INF = 0x7f7f7f7f7f7f7f7f;
  26. const int dr[] = {, , -, };
  27. const int dc[] = {-, , , };
  28. const double pi = acos(-1.0);
  29. const double eps = 1e-;
  30. const int MAXN = + ;
  31. const int MAXT = + ;
  32. using namespace std;
  33. char a[MAXN][MAXN];
  34. int mp[MAXN][MAXN];
  35. int match[MAXN];
  36. bool used[MAXN];
  37. int M, N;
  38. bool Find(int x){
  39. for(int i = ; i <= N; ++i){
  40. if(!used[i] && mp[x][i]){
  41. used[i] = true;
  42. if(!match[i] || Find(match[i])){
  43. match[i] = x;
  44. return true;
  45. }
  46. }
  47. }
  48. return false;
  49. }
  50. void solve(){
  51. int ans = ;
  52. for(int i = ; i <= M; ++i){
  53. memset(used, false, sizeof used);
  54. if(Find(i)) ++ans;
  55. }
  56. printf("%d\n", ans);
  57. }
  58. int main(){
  59. int T;
  60. scanf("%d", &T);
  61. for(int i = ; i <= T; ++i){
  62. memset(a, , sizeof a);
  63. memset(mp, , sizeof mp);
  64. memset(match, , sizeof match);
  65. scanf("%d%d", &M, &N);
  66. for(int i = ; i < M; ++i){
  67. scanf("%s", a[i]);
  68. }
  69. for(int i = ; i < M; ++i){
  70. for(int j = ; j < N; ++j){
  71. if(a[i][j] == ''){
  72. mp[i + ][j + ] = ;
  73. }
  74. }
  75. }
  76. printf("Case #%d: ", i);
  77. solve();
  78. }
  79. return ;
  80. }

UVALive 6811 Irrigation Line(二分图最小点覆盖--匈牙利算法)的更多相关文章

  1. [POJ3041] Asteroids(最小点覆盖-匈牙利算法)

    传送门 题意: 给一个N*N的矩阵,有些格子有障碍,要求我们消除这些障碍,问每次消除一行或一列的障碍,最少要几次.   解析: 把每一行与每一列当做二分图两边的点. 某格子有障碍,则对应行与列连边. ...

  2. 四川第七届 D Vertex Cover(二分图最小点覆盖,二分匹配模板)

    Vertex Cover frog has a graph with nn vertices v(1),v(2),…,v(n)v(1),v(2),…,v(n) and mm edges (v(a1), ...

  3. [POJ] 2226 Muddy Fields(二分图最小点覆盖)

    题目地址:http://poj.org/problem?id=2226 二分图的题目关键在于建图.因为“*”的地方只有两种木板覆盖方式:水平或竖直,所以运用这种方式进行二分.首先按行排列,算出每个&q ...

  4. 二分图 最小点覆盖 poj 3041

    题目链接:Asteroids - POJ 3041 - Virtual Judge  https://vjudge.net/problem/POJ-3041 第一行输入一个n和一个m表示在n*n的网格 ...

  5. Asteroids POJ - 3041 二分图最小点覆盖

       Asteroids POJ - 3041 Bessie wants to navigate her spaceship through a dangerous asteroid field in ...

  6. UVA1194 Machine Schedule[二分图最小点覆盖]

    题意翻译 有两台机器 A,B 分别有 n,m 种模式. 现在有 k 个任务.对于每个任务 i ,给定两个整数$ a_i\(和\) b_i$,表示如果该任务在 A上执行,需要设置模式为 \(a_i\): ...

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

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

  8. POJ2226 Muddy Fields(二分图最小点覆盖集)

    题目给张R×C的地图,地图上*表示泥地..表示草地,问最少要几块宽1长任意木板才能盖住所有泥地,木板可以重合但不能盖住草地. 把所有行和列连续的泥地(可以放一块木板铺满的)看作点且行和列连续泥地分别作 ...

  9. POJ1325 Machine Schedule(二分图最小点覆盖集)

    最小点覆盖集就是在一个有向图中选出最少的点集,使其覆盖所有的边. 二分图最小点覆盖集=二分图最大匹配(二分图最大边独立集) 这题A机器的n种模式作为X部的点,B机器的m种模式作为Y部的点: 每个任务就 ...

随机推荐

  1. Spark Core源代码分析: Spark任务运行模型

    DAGScheduler 面向stage的调度层,为job生成以stage组成的DAG,提交TaskSet给TaskScheduler运行. 每个Stage内,都是独立的tasks,他们共同运行同一个 ...

  2. delphi 14 内容编辑

    撤销 重做 - 复制 剪切 粘贴 删除 - 全选 不选       ///编辑 ///撤销    WebBrowser1.ExecWB(OLECMDID_REDO ,1); ///重做    WebB ...

  3. Html页中使用OCX控件

    原文:http://blog.csdn.net/mouse8166/article/details/5515657 最近准备开发一个b/s架构的应用程序需要用到activeX控件,web服务器尚未进入 ...

  4. ResolveClientUrl("~/Styles/Site.cs")%>

    区别: <%=ResolveClientUrl("~/Styles/Site.cs")%> 和 <%=ResolveUrl("~/Styles/Site ...

  5. C++中栈区 堆区 常量区

    原文地址:http://blog.csdn.net/xcyuzhen/article/details/4543264 C++中栈区 堆区 常量区(由一道面试题目而学习) -- : #include&l ...

  6. centosx64位寄存器

    [root@monitor ~]# uname -aLinux monitor 2.6.32-431.23.3.el6.x86_64 #1 SMP Thu Jul 31 17:20:51 UTC 20 ...

  7. centos x86_64--------------------------------系统调用

    http://blog.csdn.net/hmsiwtv/article/details/11022241 [root@monitor ~]# cat /usr/include/asm/unistd. ...

  8. c#_错误处理_基础

    attribute: using System; using System.Collections.Generic; using System.Linq; using System.Web; usin ...

  9. Implementing the skip list data structure in java --reference

    reference:http://www.mathcs.emory.edu/~cheung/Courses/323/Syllabus/Map/skip-list-impl.html The link ...

  10. Linux命令之hwclock

    转载:http://codingstandards.iteye.com/blog/804830 用途说明 hwclock命令,与clock命令是同一个命令,主要用来查询和设置硬件时钟(query an ...