1. /*
  2. 题意:给你一些冰岛。公共海域和浮冰,冰岛可以隔开两个公共海域,浮冰无影响
  3. 求选尽可能多的选一些公共海域点每行每列仅能选一个。
  4. 限制条件:冰山可以隔开这个限制条件。即*#*可以选两个
  5. 预处理:
  6. *****
  7. **#*#
  8. ***** 可以按行转化
  9.  
  10. *****
  11. **#oo
  12. ooo*#
  13. *****
  14.  
  15. 按行转化的基础上按列转化
  16. ***o**o
  17. **ooooo
  18. oooo*oo
  19. **o**o*
  20. 因为每行每列顶多可以增加50
  21. 所以总共最多2500*2500的矩阵
  22. 然后直接二分匹配即可
  23. */
  24. #include<stdio.h>
  25. #include<string.h>
  26. #define N 2800
  27. int ma[N][N];
  28. char s[60][60];
  29. int ans[N][N];
  30. int n,m,addx,addy;
  31. void slovex() {//按行转化
  32. int i,k;
  33. addx=0;
  34. for(i=1;i<=n;i++) {
  35. addx++;
  36. //printf("%d\n",addx);
  37. k=1;
  38. while(1) {
  39. for(;s[i][k]!='#'&&k<=m;k++) {
  40. if(s[i][k]=='*')
  41. ans[addx][k]=1;
  42. }
  43. if(k==m)//最后一个也要算进去,刚开始这里错了一直没看出来重要*****
  44. ans[addx][k]=2;
  45. if(k==m+1||k==m)
  46. break;
  47. ans[addx][k]=2;
  48. k++;
  49. addx++;
  50. }
  51. }
  52. return ;
  53. }
  54. void slovey() {//在按行转化的基础上按列转化
  55. int i,k;
  56. addy=0;
  57. for(i=1;i<=m;i++) {
  58. addy++;
  59. k=1;
  60. // printf("%d\n",addy);
  61. while(1) {
  62. for(;ans[k][i]!=2&&k<=addx;k++) {
  63. if(ans[k][i]==1)
  64. ma[k][addy]=1;
  65. }
  66. if(k==addx+1||k==addx)
  67. break;
  68. k++;
  69. addy++;
  70. }
  71. }
  72. return;
  73. }
  74. int vis[N],link[N];
  75. int findd(int u) {
  76. int i;
  77. for(i=1;i<=addy;i++)
  78. if(ma[u][i]&&vis[i]==0) {
  79. vis[i]=1;
  80. if(link[i]==-1||findd(link[i])) {
  81. link[i]=u;
  82. return 1;
  83. }
  84. }
  85. return 0;
  86. }
  87. int main() {
  88. int t,i,sum,j;
  89. scanf("%d",&t);
  90. while(t--) {
  91. scanf("%d%d",&n,&m);
  92. memset(ma,0,sizeof(ma));
  93. memset(ans,0,sizeof(ans));
  94. for(i=1;i<=n;i++)
  95. scanf("%s",s[i]+1);
  96. slovex();
  97. /* for(i=1;i<=addx;i++) {
  98. for(j=1;j<=m;j++)
  99. printf("%d ",ans[i][j]);
  100. printf("\n");
  101. }*/
  102. slovey();
  103. /* for(i=1;i<=addx;i++) {
  104. for(j=1;j<=addy;j++)
  105. printf("%d ",ma[i][j]);
  106. printf("\n");
  107. }*/
  108. memset(link,-1,sizeof(link));
  109. sum=0;
  110. for(i=1;i<=addx;i++) {//直接套模板二分匹配即可
  111. memset(vis,0,sizeof(vis));
  112. sum+=findd(i);
  113. }
  114. printf("%d\n",sum);
  115. }
  116. return 0;}

hdu 5093 二分匹配的更多相关文章

  1. Battle ships HDU - 5093二分匹配

    Battle shipsHDU - 5093 题目大意:n*m的地图,*代表海洋,#代表冰山,o代表浮冰,海洋上可以放置船舰,但是每一行每一列只能有一个船舰(类似象棋的車),除非同行或者同列的船舰中间 ...

  2. hdu 4169 二分匹配最大独立集 ***

    题意:有水平N张牌,竖直M张牌,同一方向的牌不会相交.水平的和垂直的可能会相交,求最少踢出去几张牌使剩下的牌都不相交. 二分匹配 最小点覆盖=最大匹配. 链接:点我 坐标点作为匹配的端点 #inclu ...

  3. hdu 4685 二分匹配+强连通分量

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4685 题解: 这一题是poj 1904的加强版,poj 1904王子和公主的人数是一样多的,并且给出 ...

  4. H - Prince and Princess - HDU 4685(二分匹配+强连通分量)

    题意:有N个王子M个公主,王子喜欢一些公主,而且只能是王子喜欢的人,他们才可以结婚,现在让他们尽可能多的结婚的前提下找出来每个王子都可以和谁结婚. 分析:先求出来他们的最大匹配,因为给的数据未必是完备 ...

  5. HDU 3729 二分匹配 反向匹配

    题意: 给定 n个学生 说的 自己 考试排名的 可能范围 确定最多几个人说真话 如果有多种答案,输出字典序最大的那种( 要求字典序最大,所以solve中从最大字典序开始匹配) 思路: 题目给定  点 ...

  6. HDU -1151 二分匹配与有向无环图不相交最小路径覆盖数

    题意: 考虑一个小镇,那里的所有街道都是单向的,并且每条街道都从一个路口通往另一个路口.还众所周知,从一个十字路口开始,穿过城镇的街道,您将永远无法到达同一十字路口,即,城镇的街道没有环. 基于这些假 ...

  7. HDU 2603 二分匹配

    #include <queue>#include <vector>#include <cstdio>#include <cstring>#include ...

  8. hdu 1528 二分匹配

    #include<stdio.h> #include<string.h> int map[100][100],mark[100],link[100],max2,k; int f ...

  9. Hdu 2389 二分匹配

    题目链接 Rain on your Parade Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 655350/165535 K (Ja ...

随机推荐

  1. Class.getResourceAsStream()与ClassLoader.getResourceAsStream()获取资源时的路径说明

    Class.getResourceAsStream(): com.xusweeter.iot.ws.vodafone.config.VodafoneServiceConfig.class.getRes ...

  2. android:process用法

    1.作用 android:process将组件在新进程中运行. 2.应用范围 可以出现在<application>  <activity>, <service>,  ...

  3. ASP.NET MVC+Bootstrap个人博客之文章打赏(六)

    看到新浪微博.百度百家等等平台上都带有文章“打赏”功能,觉得很新鲜,于是也想在自己的博客中加入“打赏”功能. 当然,加入打赏功能并非是真的想要让别人打赏.因为只有那些真正能引起共鸣,发人深思,让人受益 ...

  4. android开发学习——Error:Error converting bytecode to dex: Cause: com.android.dex.DexException: Multiple dex files define Lcom/google/zxing/BarcodeFormat;

    在Android Studio中,sync project没有错,但是run时会报错; http://blog.csdn.net/q568430333/article/details/50969033 ...

  5. java_dom4j解析xml

    package forRQ; import java.io.File;import java.net.MalformedURLException;import java.util.Iterator;i ...

  6. ftp 上传与下载

    //上传 ftpmg.Upload("", DateTime.Now.ToString("yyyyMMddhhmmss")); //下载 ftpmg.Downl ...

  7. AJPFX关于modifier总结

    修饰符总结 Modifiers        函数修饰符始终在返回值类型之前!!!        变量修饰符始终在变量类型之前!!!---------------------------------- ...

  8. Mysql函数、语句

    一:日期函数: 日期函数: SELECT CURDATE(); # 2018-07-07 SELECT CURTIME(); # 11:28:24 SELECT NOW(); # 2018-07-07 ...

  9. 基于ANGULAR.JS的下一代WEB应用开发-01-yeoman

    Angularjs 个人认为这是一款很好的框架!它将我们从AJAX应用的开发中解救了出来!嗯....废话就说道这里下面我们开始把! 首先我们必须了解一些核心的概念: 客户端模版 MVC 数据绑定 依赖 ...

  10. Java基础知识强化98.01:Jsp和servlet有什么区别

    1. Jsp和servlet有什么区别 首先你先要弄懂什么是servlet,servlet是在服务器端执行的java程序,只不过它有专门的一套规则(就是我们平常所说的api):jsp说得简单点就是用另 ...