称号:

id=2446">poj2446

意甲冠军:给定一个m*n矩阵,在有些地方坑,然后1*2本文叠加,反复。可以把出了坑的地方其它所有覆盖的话输出YES,否则NO

分析:有一道二分图经典题目,当然难点还是建图,一直没有思路,早上来忽然想到能够用(i-1)*m+j 吧矩阵中每一个点转化为一个数,然后相邻连接起来建图,匈牙利,可是不知道为什么不正确?求大神解释、还是理解不够深。

非常多人都是按其奇偶性建图的,由于要用1*2的纸片覆盖,那么两个值(i+j)必定一个奇数一个偶数。然后分别给图中的奇数偶数点依次从1開始标号,相邻的按其标号建图。匈牙利、、比較高速。正解!

由于必定是一个奇数点相应一个相邻偶数点。那么仅仅要求随意奇数或偶数的最大匹配就能够了。经典的建图方法。

代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <string>
  4. #include <iostream>
  5. #include <algorithm>
  6. #include <cmath>
  7. using namespace std;
  8. const int N = 1200;
  9. #define Del(x,y) memset(x,y,sizeof(x))
  10. int map[N][N],link[N],vis[N],vlink[N];
  11. int path[50][50];
  12. int n,m,t,tmp1,tmp2;
  13. bool dfs(int x)
  14. {
  15. for(int i=1; i<tmp2; i++)
  16. {
  17. if(map[x][i]==1 && vis[i]==0)
  18. {
  19. vis[i]=1;
  20. if(link[i]==-1 || dfs(link[i]))
  21. {
  22. link[i]=x;
  23. return true;
  24. }
  25. }
  26. }
  27. return false;
  28. }
  29. void solve()
  30. {
  31. int ans=0;
  32. Del(link,-1);
  33. Del(vlink,-1);
  34. for(int i=1; i<tmp1; i++)
  35. {
  36. Del(vis,0);
  37. if(dfs(i))
  38. ans++;
  39. }
  40. //printf("%d\n",ans);
  41. if(ans*2==(m*n-t))
  42. printf("YES\n");
  43. else
  44. printf("NO\n");
  45. }
  46. int main()
  47. {
  48. //freopen("Input.txt","r",stdin);
  49. while(~scanf("%d%d",&n,&m))
  50. {
  51. Del(path,0);
  52. int x,y;
  53. scanf("%d",&t);
  54.  
  55. for(int i=0; i<t; i++)
  56. {
  57. scanf("%d%d",&x,&y);
  58. path[y][x]=-1;
  59. }
  60. tmp1=1,tmp2=1;
  61. for(int i=1;i<=n;i++)
  62. {
  63. for(int j=1;j<=n;j++)
  64. {
  65. if(path[i][j]==0)
  66. {
  67. if((i+j)%2==0)
  68. path[i][j]=tmp1++;
  69. else
  70. path[i][j]=tmp2++;
  71. }
  72. }
  73. }
  74. Del(map,0);
  75. for(int i=1; i<=n; i++)
  76. {
  77. for(int j=1; j<=m; j++)
  78. {
  79. if(path[i][j]!=-1 && (i+j)%2==1)
  80. {
  81. if(path[i-1][j]>=1)
  82. map[path[i-1][j]][path[i][j]]=1;
  83. if(path[i+1][j]>=1)
  84. map[path[i+1][j]][path[i][j]]=1;
  85. if(path[i][j-1]>=1)
  86. map[path[i][j-1]][path[i][j]]=1;
  87. if(path[i][j+1]>=1)
  88. map[path[i][j+1]][path[i][j]]=1;
  89. }
  90. }
  91. }
  92. solve();
  93. }
  94. return 0;
  95. }

版权声明:本文博客原创文章,博客,未经同意,不得转载。

的二分图poj2446的更多相关文章

  1. 二分图——poj2446匈牙利算法

    /* 怎么建图: 首先分集合:不能相连的点必然在一个集合里,即对角点 再确定怎么连边: 一个点可以向上下左右连边,如果遇到了洞则不行 dfs(i),让匹配到的点接受i作为match结果 寻找增广路时, ...

  2. POJ2446 二分图最大匹配

    问题:POJ2446 分析: 采用黑白相间的方法把棋盘分成两个点集,是否可以用1*2的卡片实现全覆盖等价于二分图是否有完全匹配. AC代码 //Memory: 172K Time: 32MS #inc ...

  3. [POJ2446] Chessboard(二分图最大匹配-匈牙利算法)

    传送门 把所有非障碍的相邻格子彼此连一条边,然后求二分图最大匹配,看 tot * 2 + k 是否等于 n * m 即可. 但是连边不能重复,比如 a 格子 和 b 格子 相邻,不能 a 连 b ,b ...

  4. C - NP-Hard Problem(二分图判定-染色法)

    C - NP-Hard Problem Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:262144 ...

  5. POJ 2125 Destroying the Graph 二分图最小点权覆盖

    Destroying The Graph Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8198   Accepted: 2 ...

  6. bzoj4025 二分图

    支持加边和删边的二分图判定,分治并查集水之(表示我的LCT还很不熟--仅仅停留在极其简单的模板水平). 由于是带权并查集,并且不能路径压缩,所以对权值(到父亲距离的奇偶性)的维护要注意一下. 有一个小 ...

  7. hdu 1281 二分图最大匹配

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

  8. POJ 2226二分图最大匹配

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

  9. 二分图&网络流&最小割等问题的总结

    二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...

随机推荐

  1. 微信小程序--成语猜猜看

    原文链接:https://mp.weixin.qq.com/s/p6OMCbTHOYGJsjGOINpYvQ 1 概述 微信最近有很多火爆的小程序.成语猜猜看算得上前十火爆的了.今天我们就分享这样的小 ...

  2. int to str

    string int2str( int num){ if (num == 0 ) return " 0 " ; string str = "" ; int nu ...

  3. redis 的惊群处理和分布式锁的应用例子

    在并发量比较高的情况下redis有很多应用场景,提升查询效率,缓解底层DBio ,下面列举两个平时开发中应用过的两个例子,欢迎各位一起讨论改进. 1 . redis 惊群处理 1.1 方案的由来 Re ...

  4. COCOS2D-X 3.0在MAC下创建新IOS项目:

    首先进入:CocoStudio\Source\3.0\cocos2d-x\tools\cocos2d-console\bin 运行 ./cocos new -p com.aaaa -l cpp MyG ...

  5. USB 3.0规范中译本 第2章 术语及缩略语

    本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 本章列出并定义本规范通篇将使用的术语及缩略语. 术语/略缩语 定义 ACK(确认包) 表示积极肯定的握手包. ...

  6. js对时间的操作相关

    摘自网络,我主要用了日期增加若干天之后获得的日期,就是现在是5月2号,我增加30天,应该返回6月几号来着,就是这个意思 用到了Date.prototype.DateAdd 方法,prototype的意 ...

  7. [React] Break up components into smaller pieces using Functional Components

    We are going to ensure our app is structured in a clear way using functional components. Then, we ar ...

  8. 基于 Android NDK 的学习之旅-----JNI LOG 打印

    程序都是调出来的. 下面我介绍下JNI层的log打印方法的使用,类似与Android sdk提供的log 1.Android 应用层 MainActivity.java 主要功能代码 a)       ...

  9. Material Designer的低版本兼容实现 —— ActivityOptionsCompat

    http://www.bubuko.com/infodetail-460163.html

  10. Net程序调试

    Net程序调试 前言 作为一个.net开发工程师,不管是在写桌面程序.服务程序或web程序,在开发阶段,我们必须非常熟悉vs的动态调试技能,当然web程序可能还需要调试前端的脚本或样式,这不在本文的讨 ...