题目链接


题意很简单,是二分匹配的一种常见的题型,问题就在于怎样转换到二分图上来。

首先对对n*m-k正常点进行编号,然后遍历查找每一个正常点的上下左右是否能连接(就是判断另个点是否也是正常的),如果是就在两者之间建立双向边.这样一个就变成了一个裸的二分匹配了,对n*m-cnt个点跑匈牙利算法,因为加的是双向边,所以二分匹配的结果是答案的两倍,就是判断结果是否与n*m-k相等即可。

坑点:巨恶心的输入x表示列,y表示行。

还有32*32=1024  直接开了1000的数组疯狂wa,哈哈。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>
#define myself i,l,r
#define lson i<<1
#define rson i<<1|1
#define Lson i<<1,l,mid
#define Rson i<<1|1,mid+1,r
#define half (l+r)/2
#define inff 0x3f3f3f3f
#define lowbit(x) x&(-x)
#define PI 3.14159265358979323846
#define min4(a,b,c,d) min(min(a,b),min(c,d))
#define min3(x,y,z) min(min(x,y),min(y,z))
#define pii make_pair
#define pr pair<int,int>
const int dir[4][2]= {0,-1,-1,0,0,1,1,0};
typedef long long ll;
const ll inFF=9223372036854775807;
typedef unsigned long long ull;
using namespace std;
const int maxn=2005;
int a[40][40];
int head[maxn],used[maxn],girl[maxn];
int n,m,sign,cnt;
struct node
{int to,p;
}edge[maxn*10];
void add(int u,int v)
{edge[sign]=node{v,head[u]};head[u]=sign++;
}
void init()
{sign=cnt=0;memset(a,0,sizeof(a));memset(head,-1,sizeof(head));
}
bool check(int x,int y)
{if(x>=1&&x<=n&&y>=1&&y<=m&&a[x][y]!=-1) return true;return false;
}
bool find(int u)
{for(int i=head[u];~i;i=edge[i].p){int v=edge[i].to;if(!used[v]){used[v]=1;if(girl[v]==-1||find(girl[v])){girl[v]=u;return true;}}}return false;
}
int hungry()
{int ans=0;memset(girl,-1,sizeof(girl));for(int i=1;i<=cnt;i++){memset(used,0,sizeof(used));if(find(i)) ans++;}
//    cout<<ans/2<<endl;return ans/2;
}
int main()
{int k,x,y;while(cin>>n>>m>>k){init();for(int i=1;i<=k;i++)scanf("%d %d",&x,&y),a[y][x]=-1;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(a[i][j]==0) a[i][j]=++cnt;if(cnt%2!=0) puts("NO");else{for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){if(a[i][j]!=-1){for(int p=0;p<4;p++){int xx=i+dir[p][0];int yy=j+dir[p][1];if(check(xx,yy))add(a[i][j],a[xx][yy]),add(a[xx][yy],a[i][j]);}}}if(hungry()==cnt/2) puts("YES");else puts("NO");}}return 0;
}

POJ - 2446 Chessboard 二分匹配+建图相关推荐

  1. poj 2446:Chessboard

    2446:Chessboard 总时间限制: 2000ms 内存限制: 65536kB 描述 Alice and Bob often play games on chessboard. One day ...

  2. hdu3715 二分+2sat+建图

    题意:       给你一个递归公式,每多一层就多一个限制,问你最多能递归多少层. 思路:      先分析每一层的限制 x[a[i]] + x[b[i]] != c[i],这里面x[] = 0,1, ...

  3. 【HDOJ7058】Ink on paper(生成树,或二分答案建图+并查集联通性)

    1003 Ink on paper 题意: 给出平面中的n个点,每个点每秒向外扩散0.5cm,求多少时间后所有点的点会连在一起,输出时间的平方. 思路: 其实是很简单的最小生成树板子,Kruskal或 ...

  4. POJ ~ 2502 ~ Subway (Dijkstra + 建图)

    题意:你要从家去学校,先输入你家和学校的坐标.有一些地铁站线,每一条线上有一些站点,每一条线以一对-1,-1结束,地铁站的输入以EOF结束.坐标单位为米,你行走速度为10km/h,地铁速度为40km/ ...

  5. poj 2226 Muddy Fields(合理建图+二分匹配)

    1 /* 2 题意:用木板盖住泥泞的地方,不能盖住草.木板任意长!可以重叠覆盖! '*'表示泥泞的地方,'.'表示草! 3 思路: 4 首先让我们回忆一下HDU 2119 Matrix这一道题,一个矩 ...

  6. poj 2446 Chessboard#匈牙利算法#

    题目 求2*1的骨牌是否能覆盖棋盘. 分析 首先,如果抠掉后剩下的块数是奇数,就不会成立. 接着,如果奇数点和偶数点数量不同,也不会成立(留给读者思考) 特判结束后,二分图走起. 代码 #includ ...

  7. (匹配 二维建图) Antenna Placement --POJ --3020

    链接: http://poj.org/problem?id=3020 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82834#probl ...

  8. hdu 1045Fire Net (建图 、二分匹配)

    题意:需要求最大的放置炮台数(每个炮台都不能在其他炮台攻击范围内). 炮台攻击范围是:该炮台所在的行和列,但是'X'可以阻挡炮台攻击. 思路:二分匹配必须要有两个互不关联的集合,所以可以将行和列看做两 ...

  9. HDU 4685 Prince and Princess(二分匹配加点建图+强连通分量)

    题目链接 Problem Description There are n princes and m princesses. Princess can marry any prince. But pr ...

最新文章

  1. 别再和面试官说不懂信号量Semaphore了!
  2. Android Binder机制(1501210451 张志康)
  3. 【普及组模拟赛】手机
  4. MFC框架机制详细论述
  5. 记录用户转成超级用户的文件名字_一分钟了解Linux用户
  6. 原创电子书:C#难点逐个击破
  7. 深度测试与alpha混合(1)
  8. Linux系统重要快捷键 Shell 常用通配符
  9. Pytorch遍历DataLoader时报错BrokenPipeError: [Errno 32] Broken pipe
  10. php下一页的代码,php 实现文章上一页与下一页 代码
  11. Axure中SVG矢量图标的使用方法
  12. 2015计算机二级office真题,2015年计算机二级office题库及答案
  13. java sql查询空内容,sql查询空指针异常
  14. docker(5、网络2) 1、容器间通信的三种方式 2、 容器如何访问外部 3、 外部如何访问容器
  15. ​如何通过微信打新债?
  16. JAVA Request基本用法
  17. Linux系统实现访问localhost(127.0.0.1)浏览WWW网站目录
  18. 安全架构--4--企业基础安全运营平台建设实践
  19. python count函数代码_python中count函数简单用法
  20. Git拉取指定的远程分支

热门文章

  1. android ScrollView/NestedScrollView 添加可拖动的滚动条
  2. Android 打包 aar文件的流程以及aar的引用
  3. jenkins ssl证书报错问题解决
  4. Android 自定义圆形图片 CircleImageView
  5. mvc4 ajax grid,mvc4中用上一种grid
  6. 2022-2028年中国无菌手套产业发展动态及投资趋势预测报告
  7. 如何找到自己的优势并坚定信念执行下去
  8. Swift 中 insetBy(dx: CGFloat, dy: CGFloat) - CGRect 用法详解
  9. 28自定义View 模仿联系人字母侧栏
  10. winform让子窗体始终居于父窗体的中间