POJ - 2446 Chessboard 二分匹配+建图
题目链接
题意很简单,是二分匹配的一种常见的题型,问题就在于怎样转换到二分图上来。
首先对对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 二分匹配+建图相关推荐
- poj 2446:Chessboard
2446:Chessboard 总时间限制: 2000ms 内存限制: 65536kB 描述 Alice and Bob often play games on chessboard. One day ...
- hdu3715 二分+2sat+建图
题意: 给你一个递归公式,每多一层就多一个限制,问你最多能递归多少层. 思路: 先分析每一层的限制 x[a[i]] + x[b[i]] != c[i],这里面x[] = 0,1, ...
- 【HDOJ7058】Ink on paper(生成树,或二分答案建图+并查集联通性)
1003 Ink on paper 题意: 给出平面中的n个点,每个点每秒向外扩散0.5cm,求多少时间后所有点的点会连在一起,输出时间的平方. 思路: 其实是很简单的最小生成树板子,Kruskal或 ...
- POJ ~ 2502 ~ Subway (Dijkstra + 建图)
题意:你要从家去学校,先输入你家和学校的坐标.有一些地铁站线,每一条线上有一些站点,每一条线以一对-1,-1结束,地铁站的输入以EOF结束.坐标单位为米,你行走速度为10km/h,地铁速度为40km/ ...
- poj 2226 Muddy Fields(合理建图+二分匹配)
1 /* 2 题意:用木板盖住泥泞的地方,不能盖住草.木板任意长!可以重叠覆盖! '*'表示泥泞的地方,'.'表示草! 3 思路: 4 首先让我们回忆一下HDU 2119 Matrix这一道题,一个矩 ...
- poj 2446 Chessboard#匈牙利算法#
题目 求2*1的骨牌是否能覆盖棋盘. 分析 首先,如果抠掉后剩下的块数是奇数,就不会成立. 接着,如果奇数点和偶数点数量不同,也不会成立(留给读者思考) 特判结束后,二分图走起. 代码 #includ ...
- (匹配 二维建图) Antenna Placement --POJ --3020
链接: http://poj.org/problem?id=3020 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82834#probl ...
- hdu 1045Fire Net (建图 、二分匹配)
题意:需要求最大的放置炮台数(每个炮台都不能在其他炮台攻击范围内). 炮台攻击范围是:该炮台所在的行和列,但是'X'可以阻挡炮台攻击. 思路:二分匹配必须要有两个互不关联的集合,所以可以将行和列看做两 ...
- HDU 4685 Prince and Princess(二分匹配加点建图+强连通分量)
题目链接 Problem Description There are n princes and m princesses. Princess can marry any prince. But pr ...
最新文章
- 别再和面试官说不懂信号量Semaphore了!
- Android Binder机制(1501210451 张志康)
- 【普及组模拟赛】手机
- MFC框架机制详细论述
- 记录用户转成超级用户的文件名字_一分钟了解Linux用户
- 原创电子书:C#难点逐个击破
- 深度测试与alpha混合(1)
- Linux系统重要快捷键 Shell 常用通配符
- Pytorch遍历DataLoader时报错BrokenPipeError: [Errno 32] Broken pipe
- php下一页的代码,php 实现文章上一页与下一页 代码
- Axure中SVG矢量图标的使用方法
- 2015计算机二级office真题,2015年计算机二级office题库及答案
- java sql查询空内容,sql查询空指针异常
- docker(5、网络2) 1、容器间通信的三种方式 2、 容器如何访问外部 3、 外部如何访问容器
- ​如何通过微信打新债?
- JAVA Request基本用法
- Linux系统实现访问localhost(127.0.0.1)浏览WWW网站目录
- 安全架构--4--企业基础安全运营平台建设实践
- python count函数代码_python中count函数简单用法
- Git拉取指定的远程分支
热门文章
- android ScrollView/NestedScrollView 添加可拖动的滚动条
- Android 打包 aar文件的流程以及aar的引用
- jenkins ssl证书报错问题解决
- Android 自定义圆形图片 CircleImageView
- mvc4 ajax grid,mvc4中用上一种grid
- 2022-2028年中国无菌手套产业发展动态及投资趋势预测报告
- 如何找到自己的优势并坚定信念执行下去
- Swift 中 insetBy(dx: CGFloat, dy: CGFloat) - CGRect 用法详解
- 28自定义View 模仿联系人字母侧栏
- winform让子窗体始终居于父窗体的中间