题意:给出n*m的矩阵方块,某些方块是ponds,这些方块不能出售,然后能出售的是1*2的方块

要求求出有多少块1*2的方块能够出售,并输出这些方块的坐标(specia judge)

关键是怎么建出二分图,然后找最大匹配

可以把i+j==奇数的点提取出来,成为X集合,那么与(i,j)相邻的点就是Y集合了,然后就是二分图最大匹配

  1. //关键在于建图
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <vector>
  5. using namespace std;
  6. const int N = +;
  7. int Map[][];
  8. int n,m,k;
  9. vector<int> G[N];
  10. int dx[] = {,,-,};
  11. int dy[] = {-,,,};
  12. bool vis[N];
  13. int cy[N];
  14. int cx[N];
  15. bool dfs(int u)
  16. {
  17. for(int i=; i<G[u].size(); ++i)
  18. {
  19. int v = G[u][i];
  20. if(!vis[v])
  21. {
  22. vis[v] = true;
  23. if(cy[v] == - || dfs(cy[v]))
  24. {
  25. cy[v] = u;
  26. cx[u] = v;
  27. return true;
  28. }
  29. }
  30. }
  31. return false;
  32. }
  33. int MaxMatch()
  34. {
  35. memset(cy, -, sizeof(cy));
  36. memset(cx, -, sizeof(cx));
  37. int t = m * n;
  38. int cnt = ;
  39. for(int i=; i<t; ++i)
  40. {
  41. if(cx[i] == -)
  42. {
  43. memset(vis,,sizeof(vis));
  44. cnt += dfs(i);
  45. }
  46. }
  47. return cnt;
  48. }
  49. int main()
  50. {
  51. int i,j,x,y;
  52. while(true)
  53. {
  54. scanf("%d%d",&n,&m);
  55. if(n== && m==)
  56. break;
  57. scanf("%d",&k);
  58. for(i=; i<N; ++i)
  59. G[i].clear();
  60. memset(Map, , sizeof(Map));
  61. for(i=; i<k; ++i)
  62. {
  63. scanf("%d%d",&x,&y);
  64. x-=; y-=;
  65. Map[x][y] = ;
  66. }
  67. for(i=; i<n; ++i)
  68. for(j=; j<m; ++j)
  69. if(Map[i][j] == && (i+j)&==)
  70. {
  71. x = i * n + j;
  72. for(k=; k<; ++k)
  73. {
  74. int a = dx[k] + i;
  75. int b = dy[k] + j;
  76. if(a>= && b>= && a<n && b<m && Map[a][b] == )
  77. {
  78. y = a * n + b;
  79. G[x].push_back(y);
  80. }
  81. }
  82. }
  83. int ans = MaxMatch();
  84. printf("%d\n",ans);
  85. int t = n * m;
  86. for(i=; i<t; ++i)
  87. if(cx[i] != -)
  88. printf("(%d,%d)--(%d,%d)\n",i/n+,i%n+,cx[i]/n+,cx[i]%n+);
  89.  
  90. }
  91. return ;
  92. }

hdu1507最大匹配的更多相关文章

  1. hdu1507 最大匹配

    题目大意: 在 n*m在矩阵中,有一些点被标记为黑色,问可以多少对相邻的没有重复的白色块. 思路: 看上去与二分匹配毫无关系.但是没有其他好的解法,转化为二分匹配是正解.二分匹配的条件是{X,Y|E} ...

  2. 「日常训练」Uncle Tom's Inherited Land*(HDU-1507)

    题意与分析 题意是这样的:给你一个\(N\times M\)的图,其中有一些点不能放置\(1\times 2\)大小的矩形,矩形可以横着放可以竖着放,问剩下的格子中,最多能够放多少个矩形. 注意到是\ ...

  3. 4185 Oil Skimming 最大匹配 奇偶建图

    题目大意: 统计相邻(上下左右)的‘#’的对数. 解法: 与题目hdu1507 Uncle Tom's Inherited Land*类似,需要用奇偶建图.就是行+列为奇数的作为X集合,偶尔作为Y集合 ...

  4. Python学习实践------正向最大匹配中文分词

    正向最大匹配分词: 1.加载词典文件到集合中,取词典文件中最大长度词的length 2.每次先在句子中按最大长度分割,然后判断分割的词是否存在字典中,存在则记录此词,调整起始点. 3.不存在则按最大长 ...

  5. UOJ79 一般图最大匹配

    题目描述 从前一个和谐的班级,所有人都是搞OI的.有 nn 个是男生,有 00 个是女生.男生编号分别为 1,-,n1,-,n. 现在老师想把他们分成若干个两人小组写动态仙人掌,一个人负责搬砖另一个人 ...

  6. hdu 1281 二分图最大匹配

    对N个可以放棋子的点(X1,Y1),(x2,Y2)......(Xn,Yn);我们把它竖着排看看~(当然X1可以对多个点~) X1   Y1 X2   Y2 X3   Y3 ..... Xn   Yn ...

  7. POJ 2226二分图最大匹配

    匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是二部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图 ...

  8. hdu-1179-二分图最大匹配

    Ollivanders: Makers of Fine Wands since 382 BC. Time Limit: 2000/1000 MS (Java/Others)    Memory Lim ...

  9. codevs1022 覆盖[Hungary 二分图最大匹配]

    codevs1022 覆盖 有一个N×M的单位方格中,其中有些方格是水塘,其他方格是陆地.如果要用1×2的矩阵区覆盖(覆盖过程不容许有任何部分重叠)这个陆地,那么最多可以覆盖多少陆地面积. 输入描述  ...

随机推荐

  1. USM锐化之openCV实现,附赠调整对比度函数

    源地址:http://www.cnblogs.com/easymind223/archive/2012/07/03/2575277.html 常用Photoshop的玩家都知道Unsharp Mask ...

  2. Apache commons-net用法的一个示例

    jar: commons-io-2.4.jarcommons-net-3.3.jar Code: import java.io.File; import java.io.FileInputStream ...

  3. 辛星PHP教程之yii和ci教程已经写完,望与朋友们交流

     记得有个朋友给我说,你写的PHP框架是不是过于少了.我感觉仅仅有一个thinkphp确实不好,于是就又写了下yii和ci的教程,事实上我之前是研究过这两个框架的,因此写起来也还算得心应手吧.估计接下 ...

  4. CentOS下安装MySQL,Windows下使用Navicat for MySql连接

    安装 查看有没有安装过:          yum list installed mysql*          rpm -qa | grep mysql* 查看有没有安装包:          yu ...

  5. Samba &amp; Nginx - Resource temporarily unavailable

    先说说本人的开发环境:Win7 + Editplus + VMware(Centos+Samba+Nginx).用Samba在Centos上把web文件夹(如www)共享,然后在Win7上訪问这个文件 ...

  6. Spark SQL Catalyst源代码分析Optimizer

    /** Spark SQL源代码分析系列*/ 前几篇文章介绍了Spark SQL的Catalyst的核心运行流程.SqlParser,和Analyzer 以及核心类库TreeNode,本文将具体解说S ...

  7. Android开发 - ActivityLifecycleCallbacks用法初探

    ActivityLifecycleCallbacks是什么? Application通过此接口提供了一套回调方法,用于让开发人员对Activity的生命周期事件进行集中处理. 为什么用Activity ...

  8. PV(访问量)、UV(独立访客)、IP(独立IP) (转)

    网站统计中的PV(访问量):UV(独立访客):IP(独立IP)的定义与区别今天使用了雅虎统计,看到里面就有这个,就说说,其实里面的uv大家可能觉得很新奇,但是和站长统计里的独立访客是一样的嘛.---- ...

  9. Linux 系统文件夹结构

    登录后,在当前的命令窗口中输入命令: <span style="font-size:14px;">ls /</span> 你的终端上会出现例如以下的代码: ...

  10. 关于在ios7之后改变状态栏颜色

    看到网上都说 在ios7之后要这样设置 首先,须要在Info.plist配置文件里,添加键:UIViewControllerBasedStatusBarAppearance,并设置为YES: 然后,在 ...