题意:给出n*m的矩阵方块,某些方块是ponds,这些方块不能出售,然后能出售的是1*2的方块

要求求出有多少块1*2的方块能够出售,并输出这些方块的坐标(specia judge)

关键是怎么建出二分图,然后找最大匹配

可以把i+j==奇数的点提取出来,成为X集合,那么与(i,j)相邻的点就是Y集合了,然后就是二分图最大匹配

 //关键在于建图
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
const int N = +;
int Map[][];
int n,m,k;
vector<int> G[N];
int dx[] = {,,-,};
int dy[] = {-,,,};
bool vis[N];
int cy[N];
int cx[N];
bool dfs(int u)
{
for(int i=; i<G[u].size(); ++i)
{
int v = G[u][i];
if(!vis[v])
{
vis[v] = true;
if(cy[v] == - || dfs(cy[v]))
{
cy[v] = u;
cx[u] = v;
return true;
}
}
}
return false;
}
int MaxMatch()
{
memset(cy, -, sizeof(cy));
memset(cx, -, sizeof(cx));
int t = m * n;
int cnt = ;
for(int i=; i<t; ++i)
{
if(cx[i] == -)
{
memset(vis,,sizeof(vis));
cnt += dfs(i);
}
}
return cnt;
}
int main()
{
int i,j,x,y;
while(true)
{
scanf("%d%d",&n,&m);
if(n== && m==)
break;
scanf("%d",&k);
for(i=; i<N; ++i)
G[i].clear();
memset(Map, , sizeof(Map));
for(i=; i<k; ++i)
{
scanf("%d%d",&x,&y);
x-=; y-=;
Map[x][y] = ;
}
for(i=; i<n; ++i)
for(j=; j<m; ++j)
if(Map[i][j] == && (i+j)&==)
{
x = i * n + j;
for(k=; k<; ++k)
{
int a = dx[k] + i;
int b = dy[k] + j;
if(a>= && b>= && a<n && b<m && Map[a][b] == )
{
y = a * n + b;
G[x].push_back(y);
}
}
}
int ans = MaxMatch();
printf("%d\n",ans);
int t = n * m;
for(i=; i<t; ++i)
if(cx[i] != -)
printf("(%d,%d)--(%d,%d)\n",i/n+,i%n+,cx[i]/n+,cx[i]%n+); }
return ;
}

hdu1507最大匹配的更多相关文章

  1. hdu1507 最大匹配

    题目大意: 在 n*m在矩阵中,有一些点被标记为黑色,问可以多少对相邻的没有重复的白色块. 思路: 看上去与二分匹配毫无关系.但是没有其他好的解法,转化为二分匹配是正解.二分匹配的条件是{X,Y|E} ...

  2. 「日常训练」Uncle Tom's Inherited Land*(HDU-1507)

    题意与分析 题意是这样的:给你一个\(N\times M\)的图,其中有一些点不能放置\(1\times 2\)大小的矩形,矩形可以横着放可以竖着放,问剩下的格子中,最多能够放多少个矩形. 注意到是\ ...

  3. 4185 Oil Skimming 最大匹配 奇偶建图

    题目大意: 统计相邻(上下左右)的‘#’的对数. 解法: 与题目hdu1507 Uncle Tom's Inherited Land*类似,需要用奇偶建图.就是行+列为奇数的作为X集合,偶尔作为Y集合 ...

  4. Python学习实践------正向最大匹配中文分词

    正向最大匹配分词: 1.加载词典文件到集合中,取词典文件中最大长度词的length 2.每次先在句子中按最大长度分割,然后判断分割的词是否存在字典中,存在则记录此词,调整起始点. 3.不存在则按最大长 ...

  5. UOJ79 一般图最大匹配

    题目描述 从前一个和谐的班级,所有人都是搞OI的.有 nn 个是男生,有 00 个是女生.男生编号分别为 1,-,n1,-,n. 现在老师想把他们分成若干个两人小组写动态仙人掌,一个人负责搬砖另一个人 ...

  6. hdu 1281 二分图最大匹配

    对N个可以放棋子的点(X1,Y1),(x2,Y2)......(Xn,Yn);我们把它竖着排看看~(当然X1可以对多个点~) X1   Y1 X2   Y2 X3   Y3 ..... Xn   Yn ...

  7. POJ 2226二分图最大匹配

    匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是二部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图 ...

  8. hdu-1179-二分图最大匹配

    Ollivanders: Makers of Fine Wands since 382 BC. Time Limit: 2000/1000 MS (Java/Others)    Memory Lim ...

  9. codevs1022 覆盖[Hungary 二分图最大匹配]

    codevs1022 覆盖 有一个N×M的单位方格中,其中有些方格是水塘,其他方格是陆地.如果要用1×2的矩阵区覆盖(覆盖过程不容许有任何部分重叠)这个陆地,那么最多可以覆盖多少陆地面积. 输入描述  ...

随机推荐

  1. 与众不同 windows phone (11) - Background Task(后台任务)之警报(Alarm)和提醒(Reminder)

    原文:与众不同 windows phone (11) - Background Task(后台任务)之警报(Alarm)和提醒(Reminder) [索引页][源码下载] 与众不同 windows p ...

  2. leetcode 最长连续序列 longest consecutive sequence

    转载请注明来自souldak,微博:@evagle 题目(来自leetcode): 给你一个n个数的乱序序列,O(N)找出其中最长的连续序列的长度. 例如给你[100, 4, 200, 1, 3, 2 ...

  3. c/c++使用VS2013连接MySQL与ubuntu下c链接mysql

    vs连接数据库事实上就是将mysql数据库.h头文件接口.lib链接文件和dll运行文件增加到项目中.以下是配置怎样增加. 转于http://www.cnblogs.com/justinzhang/a ...

  4. Abot 爬虫

    Abot 爬虫分析-整体结构 1. 引言 在Github 上搜索下Web Crawler 有上千个开源的项目,但是C#的仅仅只有168 个,相比于Java 或者Python 确实少的可怜.如果按照St ...

  5. 事务不提交,也有可能写redo和数据文件

    事务不提交,也有可能写redo和数据文件

  6. Dvtm -- 平铺式终端

    Dvtm -- 平铺式终端_Linux伊甸园开源社区-24小时滚动更新开源资讯,全年无休! Dvtm -- 平铺式终端 关注我们: 如果你使用过 Dwn 或 Awesome 这种平铺式窗口管理器,一定 ...

  7. Java Web----Java Web的数据库操作(二)

    Java Web的数据库操作 三.JDBC操作数据库 上一篇介绍了JDBC API,之后就可以通过API来操作数据库,实现对数据库的CRUD操作了. http://blog.csdn.net/zhai ...

  8. HTML5初步——新的表单元素和属性

    HTML5初步--新的表单元素和属性 HTML5初步--新的表单元素和属性 <!DOCTYPE html> <html> <head> <meta chars ...

  9. [置顶] CentOS release 5.4 (Final)重置root密码(图文)

  10. JAVA实现Shell排序

    Shell排序可以理解为插入排序的变种,它充分利用了插入排序的两个特点: (1). 当数据规模小的时候非常高效. (2). 当给定数据已经有序时的时间代价为O(N) 所以,Shell排序每次把数据分成 ...