题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1507

题目大意:给你一张n*m大小的图,可以将白色正方形凑成1*2的长方形,问你最多可以凑出几块,并输出任一组匹配方案。

解题思路:按行列和奇偶划分两个集合,从而得到二分图,然后进行最大匹配,根据link数组的匹配结果输出相应匹配即可。

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int N=1e2+; int n,m,cnt,idx;
int mp[N][N],link[N],head[N];
bool vis[N];
int d[][]={,,,,-,,,-}; struct node{
int x,y;
node(){}
node(int x,int y):x(x),y(y){}
}a[N*N]; struct enode{
int to,next;
}edge[N*N]; void init(){
cnt=;
idx=;
memset(mp,,sizeof(mp));
memset(head,,sizeof(head));
} void addedge(int u,int v){
edge[idx].to=v;
edge[idx].next=head[u];
head[u]=idx++;
} bool dfs(int u){
for(int i=head[u];i;i=edge[i].next){
int t=edge[i].to;
if(!vis[t]){
vis[t]=true;
if(link[t]==-||dfs(link[t])){
link[t]=u;
return true;
}
}
}
return false;
} int max_match(){
memset(link,-,sizeof(link));
int ans=;
for(int i=;i<=cnt;i++){
memset(vis,false,sizeof(vis));
if(dfs(i)) ans++;
}
return ans;
} int main(){
while(~scanf("%d%d",&n,&m)&&n&&m){
init();
int k;
scanf("%d",&k);
for(int i=;i<=k;i++){
int x,y;
scanf("%d%d",&x,&y);
mp[x][y]=-;
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(mp[i][j]!=-){
mp[i][j]=++cnt;
a[cnt]=node(i,j);
}
}
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
//加了(i+j)%2这句分奇偶就对了,不知道为什么不分会错。。。。
if(mp[i][j]!=-&&(i+j)%==){
for(int k=;k<;k++){
int x=i+d[k][];
int y=j+d[k][];
if(x<=||y<=||x>n||y>m||mp[x][y]==-) continue;
addedge(mp[i][j],mp[x][y]);
}
}
}
}
printf("%d\n",max_match());
vector<node>ans;
for(int i=;i<=cnt;i++){
if(link[i]!=-){
ans.push_back(node(i,link[i]));
link[i]=link[link[i]]=-;
}
}
for(int i=;i<ans.size();i++){
int p1=ans[i].x,p2=ans[i].y;
printf("(%d,%d)--(%d,%d)\n",a[p1].x,a[p1].y,a[p2].x,a[p2].y);
}
printf("\n");
}
return ;
}

HDU 1507 Uncle Tom's Inherited Land(最大匹配+分奇偶部分)的更多相关文章

  1. HDU 1507 Uncle Tom's Inherited Land*(二分图匹配)

    Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  2. Hdu 1507 Uncle Tom's Inherited Land* 分类: Brush Mode 2014-07-30 09:28 112人阅读 评论(0) 收藏

    Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  3. HDU 1507 Uncle Tom's Inherited Land*(二分匹配,输出任意一组解)

    Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  4. HDU 1507 Uncle Tom's Inherited Land*

    题目大意:给你一个矩形,然后输入矩形里面池塘的坐标(不能放东西的地方),问可以放的地方中,最多可以放多少块1*2的长方形方块,并输出那些方块的位置. 题解:我们将所有未被覆盖的分为两种,即分为黑白格( ...

  5. HDU——T 1507 Uncle Tom's Inherited Land*

    http://acm.hdu.edu.cn/showproblem.php?pid=1507 Time Limit: 2000/1000 MS (Java/Others)    Memory Limi ...

  6. hdu-----(1507)Uncle Tom's Inherited Land*(二分匹配)

    Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  7. Uncle Tom's Inherited Land*

    Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...

  8. XTU 二分图和网络流 练习题 B. Uncle Tom's Inherited Land*

    B. Uncle Tom's Inherited Land* Time Limit: 1000ms Memory Limit: 32768KB 64-bit integer IO format: %I ...

  9. ZOJ1516 Uncle Tom's Inherited Land(二分图最大匹配)

    一个经典的构图:对格子进行黑白染色,黑白的点分别作XY部的点. 这一题的边就是可以出售的单位面积2的土地,边的端点就是这个土地占用的X部和Y部的两个点. 这样就建好二分图,要求最多土地的答案显然是这个 ...

随机推荐

  1. 个人在 laravel 开发中使用到的一些技巧(持续更新)

    1.更高效率地查询:使用批量查询代替 foreach 查询(多次 io 操作转换为一次 io操作) 如果想要查看更详尽的介绍,可以看看这篇文章 什么是 N+1 问题,以及如何解决 Laravel 的 ...

  2. Turn Off The Light HDU - 6307

    题目大意 是有n个位置有灯,告诉你每个位置灯是开着的还是关着的,告诉你你的初始位置p,你可以往左或者右移动一步(在1到n的范围里移动), 并且在移动后必须按下开关(就是使当前打开的灯关上,当前未打开的 ...

  3. 字符串化#、拼接字符##和可变参数宏(...和_ _VA_ARGS_ _)

    宏定义的使用与注意事项 ##是一个连接符号,用于把参数连在一起 #是“字符串化”的意思.出现在宏定义中的#是把跟在后面的参数转换成一个字符串#define paster( n ) printf( &q ...

  4. jenkins集成sonarqube代码审核

    目前在持续集成领域,除了后起之秀travis ci,在老牌工具中,最著名的还是非jenkins莫属.本篇文章简单的说一声jenkins与sonarqube的集成来实现代码的静态审核. 在这里不详细罗列 ...

  5. GoWeb_01:GoWeb基础之mac上mysql安装

    Mac下的MySql安装与配置 1. 访问MySQL的官网 http://www.mysql.com/downloads/ 然后在页面中会看到“MySQL Community Server”下方有一个 ...

  6. CF&&CC百套计划1 Codeforces Round #449 A. Nephren gives a riddle

    http://codeforces.com/contest/896/problem/A 第i个字符串嵌套第i-1个字符串 求第n个字符串的第k个字母 dfs #include<map> # ...

  7. SQL语句(二十一)—— 触发器(DML触发器)

    触发器 一 .触发器概述(特殊的存储过程) 定义: 在修改指定表值的数据时执行的 存储过程. 不同的是 : 执行存储过程要使用EXEC语句来调用,而触发器的执行不需要使用EXEC语句来调用. 作用: ...

  8. android onActivityResult的执行

    1.如果activity中重写了onActivityResult函数,同时添加在该activity的fragment也重写了onActivtyResult函数,那么会执行Activity的onActi ...

  9. sparse representation 与sparse coding 的区别的观点

    @G_Auss: 一直觉得以稀疏为目标的无监督学习没有道理.稀疏表示是生物神经系统的一个特性,但它究竟只是神经系统完成任务的副产物,还是一个优化目标,没有相关理论,这里有推理漏洞.实际上,稀疏目标只能 ...

  10. Redis学习五:Redis的持久化-RDB

    RDB(Redis DataBase) 一.是什么 1.概念:在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里 2.执行方式: R ...