题意:首先是定两个规则:
1.任何正常的网格都应完全用一张卡片覆盖。
2.一张卡应正好覆盖两个正常的相邻网格。
求解是否可以按照上述规则覆盖棋盘(除了有洞的地方外)。
将横坐标,纵坐标的和为奇数的视为A集合;
将横坐标,纵坐标的和为偶数的视为B集合;
求解两个集合的最大匹配数,如果结果sum=(nm-p)/2(因为给定的就是12大小的卡片,所以是2的偶数才可能),则可以按照上述的规则覆盖棋盘,否则不可以。
这道题也是看了大佬的文章之后才想到的!

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxx=604;
int used[maxx];
int nxt[maxx];
int line[maxx][maxx];void init(){memset(used,0,sizeof(used));memset(line,0,sizeof(line));memset(nxt,0,sizeof(nxt));
}
int find(int x,int p){for(int i=1;i<p;i++){if(line[x][i]==1&&used[i]==0){used[i]=1;if(nxt[i]==0||find(nxt[i],p)){nxt[i]=x;return 1;}}}return 0;
}
int match(int n,int p){int sum=0;for(int i=1;i<n;i++){memset(used,0,sizeof(used));if(find(i,p)){sum+=1;}}return sum;
}
int main(){int n,m,p;while(scanf("%d %d %d",&n,&m,&p)!=EOF){init();int ma[maxx][maxx];memset(ma,0,sizeof(ma));for(int i=1;i<=p;i++){int a,b;cin>>a>>b;ma[b][a]=-1;//注意这里 }if((n*m-p)%2!=0){cout<<"NO"<<endl;}else{int cnt1=1;int cnt2=1;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(ma[i][j]==0){if((i+j)%2==0){ma[i][j]=cnt2++; }else{ma[i][j]=cnt1++;}}}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if((i+j)%2==0||ma[i][j]==-1){continue;}if(i-1>=1&&ma[i-1][j]>0){line[ma[i][j]][ma[i-1][j]]=1;}if(i+1<=n&&ma[i+1][j]>0){line[ma[i][j]][ma[i+1][j]]=1;}if(j-1>=1&&ma[i][j-1]>0){line[ma[i][j]][ma[i][j-1]]=1;}if(j+1<=m&&ma[i][j+1]>0){line[ma[i][j]][ma[i][j+1]]=1;}}}int sum=match(cnt1,cnt2);if(sum==(n*m-p)/2){cout<<"YES"<<endl;}else{cout<<"NO"<<endl;}}}return 0;
}

poj2446(匈牙利算法)相关推荐

  1. 二分图匹配匈牙利算法DFS实现

    1 /*==================================================*\ 2 | 二分图匹配(匈牙利算法DFS 实现) 3 | INIT: g[][]邻接矩阵; ...

  2. 解题报告:luogu P2423 [HEOI2012]朋友圈【最大团转最大点独立集(匈牙利算法+时间戳优化)】

    图的最大团:"任意两点之间都有一条边相连"的子图被称为无向图的团,点数最多的团为图的最大团 朋友圈中任意两个点之间都有关系,既是图中的团. 答案就是图中的最大团. 我们如果把B国的 ...

  3. 二分图最大匹配(匈牙利算法) POJ 3020 Antenna Placement

    题目传送门 1 /* 2 题意:*的点占据后能顺带占据四个方向的一个*,问最少要占据多少个 3 匈牙利算法:按坐标奇偶性把*分为两个集合,那么除了匹配的其中一方是顺带占据外,其他都要占据 4 */ 5 ...

  4. 二分图匹配的匈牙利算法

    匈牙利算法,很绕,其实写起来也就一点点长度.. bool find(int a){int i,j;for(i=head[a];i;i=next[i]){j=to[i];//获得相邻的点if(!unab ...

  5. 二分图-匈牙利算法模板

    二分图就不赘述了,我在知识资料整理有相关资料. .最大匹配  .最小路径覆盖  .最小点覆盖  .最大独立集 最大匹配:二分图中边集最大的那个匹配 最小路径(边)覆盖:用尽量小的不想交简单路径覆盖有向 ...

  6. 二分图的最大匹配—匈牙利算法

    [基本概念]: 二分图: 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分 ...

  7. BZOJ 1433 Luogu P2055 [ZJOI2009]假期的宿舍 匈牙利算法

    刚学了匈牙利正好练练手(我不会说一开始我写错了)(怕不是寒假就讲了可是我不会) 把人看做左部点,床看作右部点 建图:(!!在校相当于有床,不在校相当于没有床 但是要来学校) 1.在校的 不走的人 自己 ...

  8. 匈牙利算法学习笔记_Python代码

    学习华为上机测试题,遇见了下面题,很有意思,核心是匈牙利算法问题. 特此学习记录.资料均参考自网络. 匈牙利算法目的:找出两边最大的匹配的数量. 参考资料: https://blog.csdn.net ...

  9. 二分图的最大匹配(匈牙利算法)HDU1083

    二分图: 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同 ...

  10. 用匈牙利算法求二分图的最大匹配

    转载大神的!! 什么是二分图,什么是二分图的最大匹配,这些定义我就不讲了,网上随便都找得到.二分图的最大匹配有两种求法,第一种是最大流(我在此假设读者已有网络流的知识):第二种就是我现在要讲的匈牙利算 ...

最新文章

  1. mysql sql查询json数据_mysql如何查询json的值
  2. springcloud(四):熔断器Hystrix
  3. [CF1076E]Vasya and a Tree
  4. opencv安装与python cv2安装
  5. python:封装连接数据库方法
  6. java-图像的几何变换
  7. 克罗地亚第二狂想曲难度_黄海保级难度增加,将送强力前锋去富力,与建业竞争半个降级名额...
  8. windows7上启动jmeter报错,寻求解决办法?
  9. 字节跳动:高级人才的五个基本素质
  10. java整合jdbc数据库连接工具(项目亲测)
  11. 华为服务器系统启动项,服务器设置开机启动项
  12. 一个链接搞定源码下载
  13. 安装Centos系统时选择安装的包
  14. 如何从头开始创建可用于生产环境的Webpack 4配置
  15. Linux面试题及答案
  16. 什么是MTTF、MTTR、MTBF和MTRF?
  17. 【面试宝典】Mysql面试题大全
  18. 内网穿透-端口映射-跨域问题解决
  19. codeforces 546B Soldier and Badges
  20. IC/FPGA一文练完

热门文章

  1. 轻松学Pytorch–环境搭建与基本语法
  2. 视觉SLAM前端特征检测与跟踪的思考
  3. 三维重建新应用:精确还原凶杀现场细节!
  4. 综述 | 图像去噪方法比较
  5. 链表问题11——两个单链表相交的系列问题(三):判断两个有环链表是否相交
  6. Java-001-面向对象
  7. 关于如何换肤、子类化的解决方案
  8. ADMT3.2域迁移之Server2003至Server2012系列(八)生成密钥文件及安装密码迁移工具...
  9. HTTP1.1协议请求方面参数
  10. [置顶]使用 maven 插件 maven-shade-plugin 对可执行 java 工程及其全部依赖 jar 进行打包...