快要比赛了 看看原来做过的题 感觉这道题当时做的还是挺费劲的 所以发一下

题意:

一个土豪要建别墅 因为有的地区地方不够大 所以要拆屋子

每个地方的字母就是对应开发商的地盘

没有字母的就是自由土地

一个开发商的土地只能拆一次

一片土地只能建一个别墅

问最多能建几个别墅

思路:

建图之后直接跑算法……

坑点是如果直接可以建别墅 就不用跑算法直接+1……

而且一片土地只能建一个别墅……

算法还是很模板的

(PS:代码太长风格不好的话真的没有可读性-_-||)

  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<math.h>
  5. #include<string.h>
  6. #include<string>
  7. #include<map>
  8. #include<set>
  9. #include<vector>
  10. #include<queue>
  11. #define M(a,b) memset(a,b,sizeof(a))
  12. #define ll long long
  13. using namespace std;
  14. const int inf=0x3f3f3f;
  15. int linker[];
  16. bool zimu[];
  17. int match[][];
  18. bool visy[],vis[][];
  19. bool jump[];
  20. bool find_(int a)
  21. {
  22. for(int i=; i<; i++)
  23. {
  24. if(match[a][i]==&&visy[i]==)
  25. {
  26. visy[i]=;
  27. if(linker[i]==||find_(linker[i]))
  28. {
  29. linker[i]=a;
  30. return true;
  31. }
  32. }
  33. }
  34. return false;
  35. }
  36. int main()
  37. {
  38. int T;
  39. scanf("%d",&T);
  40. while(T--)
  41. {
  42. M(jump,);
  43. M(linker,);
  44. M(match,);
  45. int s,m,n,h,w;
  46. scanf("%d%d%d%d%d",&s,&m,&n,&h,&w);
  47. getchar();
  48. for(int i=; i<s; i++)
  49. {
  50. char map_[m+][n+];
  51. memset(zimu,false,sizeof(zimu));
  52. for(int j=; j<m; j++)
  53. gets(map_[j]);
  54. for(int j=; j<m; j++)
  55. for(int k=; k<n; k++)
  56. if(map_[j][k]!='') zimu[map_[j][k]-'A']=true;
  57. for(int j=; j<; j++)
  58. {
  59. int cnt=;
  60. if(zimu[j])
  61. {
  62. char map_1[m+][n+];
  63. for(int k=; k<m; k++)
  64. for(int l=; l<n; l++)
  65. if(map_[k][l]=='A'+j) map_1[k][l]='';
  66. else map_1[k][l]=map_[k][l];
  67. M(vis,);
  68. for(int k=; k+h-<m; k++)
  69. {
  70. for(int l=; l+w-<n; l++)
  71. {
  72. if(map_1[k][l]==''&&!vis[k][l]&&k+h-<m&&l+w-<n)
  73. {
  74. bool ok=true;
  75. for(int p=; p<h; p++)
  76. {
  77. for(int q=; q<w; q++)
  78. {
  79. if(map_1[k+p][l+q]!=''&&!vis[k+p][l+q])
  80. {
  81. ok=false;
  82. }
  83. }
  84. }
  85. if(ok) cnt=;
  86. }
  87. }
  88. }
  89. }
  90. match[i+][j+]=cnt;
  91. if(j+==)
  92. {
  93. M(vis,);
  94. bool ok=true;
  95. cnt=;
  96. for(int k=; k+h-<m; k++)
  97. {
  98. for(int l=; l+w-<n; l++)
  99. {
  100. ok=true;
  101. if(map_[k][l]==''&&!vis[k][l])
  102. {
  103. for(int p=; p<h; p++)
  104. {
  105. for(int q=; q<w; q++)
  106. {
  107. if(map_[k+p][l+q]!=''&&!vis[k+p][l+q])
  108. {
  109. ok=false;
  110. }
  111. }
  112. }
  113. if(ok) cnt=;
  114. }
  115. }
  116. }
  117. if(cnt) jump[i+]=true;
  118. }
  119. }
  120. }
  121. int ans=;
  122. for(int i=; i<=s; i++)
  123. {
  124. M(visy,);
  125. if(jump[i]) ans++;
  126. else if(find_(i)) ans++;
  127. }
  128. printf("%d\n",ans);
  129. }
  130. return ;
  131. }
  132. /*
  133.  
  134. 2
  135. 3 4 3 3 2
  136. A0B
  137. 000
  138. 0A0
  139. 00B
  140. AA0
  141. 00B
  142. 0B0
  143. 000
  144. A0A
  145. 000
  146. B00
  147. B00
  148. 3 4 3 3 2
  149. A0B
  150. 000
  151. 0A0
  152. 00B
  153. AA0
  154. 00B
  155. 0B0
  156. 000
  157. A0A
  158. 000
  159. 0B0
  160. B00
  161.  
  162. */

[ An Ac a Day ^_^ ] UVALive 2635 Housing Complexes 二分图最大匹配的更多相关文章

  1. UVaLive 6525 Attacking rooks (二分图最大匹配)

    题意:给定一个 n * n的图,X是卒, . 是空位置,让你放尽量多的车,使得他们不互相攻击. 析:把每行连续的 . 看成X集体的一个点,同理也是这样,然后求一个最大匹配即可. 代码如下: #prag ...

  2. UVALive 2635 匈牙利算法

    题意 给出k块地 规模n*m 需要在每块地中找至多一块h*w的地 这些地中如果包含字母 只能包含一种字母 如果一块地中选地使用了A 其余的地就不能使用A 但是全0可以重复 问 最后能最多选出来多少块地 ...

  3. UVALive 6811 Irrigation Line(二分图最小点覆盖--匈牙利算法)

    题意:求最少的线可以覆盖一个由0.1两种数字组成的图中所有的1. eg: 只需要两条线即可. 分析: 1.先为上述例子的行列标号 2.若图中数字为1,则代表该数字所在的行与列有关联. 例如第r1行第c ...

  4. UVALive 5033 I'm Telling the Truth 二分图最大匹配(略有修改)

    I - I'm Telling the Truth Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu ...

  5. 2019/2/18 Test

    图论模拟 [简述情况]: \(110/400\) \(20 \leq rank\) \(AC:1\) 有思路但未\(AC:0\) 无思路\(:3\) 题目 简述 \(LUOGU4304\) 二分图最大 ...

  6. UVALive 5903 Piece it together(二分图匹配)

    给你一个n*m的矩阵,每个点为'B'或'W'或'.'.然后你有一种碎片.碎片可以旋转,问可否用这种碎片精确覆盖矩阵.N,M<=500 WB  <==碎片 W 题目一看,感觉是精确覆盖(最近 ...

  7. Codeforces 590E - Birthday(AC 自动机+Dilworth 定理+二分图匹配)

    题面传送门 AC 自动机有时只是辅助建图的工具,真的 首先看到多串问题,果断建出 AC 自动机.设 \(m=\sum|s_i|\). 不难发现子串的包含关系构成了一个偏序集,于是我们考虑转化为图论,若 ...

  8. HOJ题目分类

    各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...

  9. ACM进阶计划

    ACM进阶计划ACM队不是为了一场比赛而存在的,为的是队员的整体提高.大学期间,ACM队队员必须要学好的课程有:lC/C++两种语言l高等数学l线性代数l数据结构l离散数学l数据库原理l操作系统原理l ...

随机推荐

  1. centos6.5 安装python3.5

    1.CentOS6.5 安装Python 的依赖包 yum groupinstall "Development tools" yum install zlib-devel bzip ...

  2. 命令行解决mysql中文乱码

    修改my.ini文件中的 [mysql] default-character-set=gbk [mysqld] # The default character set that will be use ...

  3. 创建 userSettings/Microsoft.SqlServer.Configuration.LandingPage.Properties.Settings 的配置节处理程序时出错: 未能加载文件或程序集“System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”或它的某一个依赖项。系统没找到指定的文件

    创建 userSettings/Microsoft.SqlServer.Configuration.LandingPage.Properties.Settings 的配置节处理程序时出错: 未能加载文 ...

  4. re模块 | Python 3.5

    https://docs.python.org/3/library/re.html http://www.cnblogs.com/PythonHome/archive/2011/11/19/22554 ...

  5. Qt出现常量有换行符的错误的解决方法

    可以使用 QString::fromLocal8Bit 来将本地字符编码转换为 Unicode 形式的 QString.

  6. sharepoint 2013基于AD的Form表单登录(三)——选择用户时,屏蔽掉AD。

    //来源:http://www.cnblogs.com/lrforever/p/3695820.html 隐藏AD人员选择,$ad.IsVisible设置为true,则显示出AD里用户 $cpm = ...

  7. 如何通过subId来获取phoneId?

    androidL中使用一张数据表来保存sim卡信息:telephony.db中有一张记录SIM卡信息的表,siminfo: CREATE TABLE siminfo(_id INTEGER PRIMA ...

  8. C++虚成员函数表vtable

    介绍一下多态是如何实现的,关于如何实现多态,对于程序设计人员来说即使不知道也是完全没有关系的,但是对于加深对多态的理解具有重要意义,故而在此节中稍微阐述一下多态的实现机制. 在C++中通过虚成员函数表 ...

  9. NYOJ-1057 寻找最大数(三)(贪心)

    寻找最大数(三) 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数. 求这个新的整数的 ...

  10. 【Python之路】第二篇--初识Python

    Python简介 Python可以应用于众多领域,如:数据分析.组件集成.网络服务.图像处理.数值计算和科学计算等众多领域.目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube.D ...