博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ_2446_Chessboard
阅读量:7226 次
发布时间:2019-06-29

本文共 1532 字,大约阅读时间需要 5 分钟。

题意:给出一个m*n的矩阵,其中有的地方有坑,然后用1*2的纸片去覆盖图,纸片不能重复,能够把出了坑的地方其他全部覆盖的话输出YES,否则NO。

分析:按其奇偶性建图的,因为要用1*2的纸片覆盖,那么两个值(i+j)必然一个奇数一个偶数,然后分别给图中的奇数偶数点依次从1开始标号,相邻的按其标号建图,匈牙利。因为必然是一个奇数点对应一个相邻偶数点,那么只要求任意奇数或偶数的最大匹配就可以了。

总结:二分图的第一道题,了解了匈牙利算法,对dfs实现匈牙利算法还不熟悉(不能熟练写出递归程序,长期以来的问题)。

代码:

#include
#include
#include
using namespace std;#define Del(x,y) memset(x,y,sizeof(x))int path[33][33],map[600][600],vis[600],link[600];int cnt1,cnt2,m,n,k;int dfs(int x){ for(int i=1; i<=cnt2; i++) if(map[x][i]==1) if(vis[i]==0) { vis[i]=1; if(link[i]==-1||dfs(link[i])) { link[i]=x; return 1; } } return 0;}void solve(){ int ans=0; Del(link,-1); for(int i=1; i<=cnt1; i++) { Del(vis,0); if(dfs(i)) ans++; } //printf("%d\n",ans); if((ans*2)==(n*m-k)) printf("YES\n"); else printf("NO\n");}int main(){ int x,y; scanf("%d%d%d",&m,&n,&k); Del(path,0); for(int i=0;i
0) map[path[i-1][j]][path[i][j]]=1; if(path[i+1][j]>0) map[path[i+1][j]][path[i][j]]=1; if(path[i][j-1]>0) map[path[i][j-1]][path[i][j]]=1; if(path[i][j+1]>0) map[path[i][j+1]][path[i][j]]=1; } solve(); return 0;}

 

转载于:https://www.cnblogs.com/jasonlixuetao/p/4755574.html

你可能感兴趣的文章
点击文字,把input type="radio"也选中
查看>>
第一章 Java多线程技能
查看>>
Java 集合系列-第八篇-Map架构
查看>>
springmvc 3.2 @MatrixVariable bug 2
查看>>
React-Native PanResponder手势识别器
查看>>
IOS11 光标错位问题
查看>>
如何设计用户登录
查看>>
linux安装mysql5.7.19
查看>>
Zookeeper+ActiveMQ 集群实现
查看>>
加权有向图问题2----多源最短路径问题(Floyd算法)和关键路径算法
查看>>
logback logback.xml常用配置详解(三) <filter>
查看>>
KgMall B2B/B2B2c/C2C版店铺商号初始化
查看>>
Linux内核的ioctl函数学习
查看>>
Liunx Shell入门
查看>>
Thread的中断
查看>>
linux --- 内存管理
查看>>
PostgreSQL
查看>>
CPU 超线程、多核
查看>>
用ASCII码显示string.xml中的特殊字符
查看>>
网站301跳转到新域名
查看>>