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

题意:

平面上有一些1×2的骨牌,每张骨牌要么水平放置,要么竖直放置,并且保证同方向放置的骨牌不会相互覆盖。水平放置的牌和竖直放置的牌可能相互覆盖,现在要移去一些牌,使得剩下的牌任何两张都不会相互覆盖,问桌面上最多能剩多少张牌。

分析:

如果把每张牌看作一个结点,则共有两类结点,容易联想到二分图。另外,同方向的牌不会相互覆盖,不同方向的可能相互覆盖,易想到二分图的一个重要性质:同类结点间不会连边,不同结点间可以连边。所以显然是这方面的问题了。

解题思路:

根据上述分析,这是一个二分图问题,每张牌作为一个结点,水平放置的成点集X,竖直放置的成点集Y,若两张牌相互覆盖,则两点间连边。这样建图后,一个“覆盖点”对应一条边,成了裸的“最小点覆盖”问题,即:结点数-最大二分匹配数。

代码:

#include <cstdio>
#include <cstring>
using namespace std;
#define N 1200 bool mp[N][N];
int x[N], y[N], f[N], rm[N], lm[N];
int n, m; bool path(int s)
{
for(int i = ; i <= m; i++)
if(f[i] == && mp[s][i])
{
f[i] = ;
if(rm[i] == || path(rm[i]))
{
rm[i] = s; lm[s] = i;
return true;
}
}
return false;
} int MaxMatch()
{
memset(rm, , sizeof(rm));
memset(lm, , sizeof(lm));
int ans = ;
for(int i = ; i <= n; i++)
if(!lm[i])
{
memset(f, , sizeof(f));
if(path(i)) ans++;
}
return ans;
}
int main()
{
int i, j;
while(~scanf("%d %d", &n, &m), n||m)
{
int a, b;
for(i = ; i <= n; i++)
scanf("%d %d", &x[i], &y[i]);
memset(mp, false, sizeof(mp));
for(i = ; i <= m; i++)
{
scanf("%d %d", &a, &b);
for(j = ; j <= n; j++)
if( (a == x[j] && b == y[j]) ||
(a == x[j] && b == y[j] - ) ||
(a == x[j] + && b == y[j]) ||
(a == x[j] + && b == y[j]-)
) mp[j][i] = true;
}
int ans = MaxMatch();
printf("%d\n", n+m-ans);
}
return ;
}

hdu 4619 Warm up 2 (二分匹配)的更多相关文章

  1. hdu 4619 Warm up 2 二分图匹配

    题目链接 给两种长方形, 水平的和垂直的, 大小都为1*2, n个水平的, m个垂直的, 给出它们的坐标. 水平的和垂直的可以相互覆盖, 但是同种类型的没有覆盖. 去掉一些长方形, 使得剩下的全部都没 ...

  2. HDU 4619 Warm up 2(2013多校2 1009 二分匹配)

    Warm up 2 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total S ...

  3. HDU-4619 Warm up 2 二分匹配

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4619 一看就知道是二分匹配题目,对每个点拆点建立二分图,最后答案除2.因为这里是稀疏图,用邻接表处理. ...

  4. HDU 2063 过山车(二分匹配入门)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 二分匹配最大匹配数简单题,匈牙利算法.学习二分匹配传送门:http://blog.csdn.ne ...

  5. HDU - 1045 Fire Net(二分匹配)

    Description Suppose that we have a square city with straight streets. A map of a city is a square bo ...

  6. hdu 4619 Warm up 2 网络流 最小割

    题意:告诉你一些骨牌,然后骨牌的位置与横竖,这样求最多保留多少无覆盖的方格. 这样的话有人用二分匹配,因为两个必定去掉一个,我用的是最小割,因为保证横着和竖着不连通即可. #include <s ...

  7. hdu 4619 Warm up 2(并查集)

    借用题解上的话,就是乱搞题.. 题意理解错了,其实是坐标系画错了,人家个坐标系,我给当矩阵画,真好反了.对于题目描述和数据不符的问题,果断相信数据了(这是有前车之鉴的hdu 4612 Warm up, ...

  8. HDU 2063 过山车 二分匹配

    解题报告:有m个女生和n个男生要结成伴坐过山车,每个女生都有几个自己想选择的男生,然后要你确定最多能组成多少对组合. 最裸的一个二分匹配,这是我第一次写二分匹配,给我最大的感受就是看那些人讲的匈牙利算 ...

  9. hdu 1528 Card Game Cheater (二分匹配)

    Card Game Cheater Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

随机推荐

  1. 攻防世界 | hello_pwn

    看样子是要让我们通过read(0, &unk_601068, 0x10uLL),读入 unk_601068 将 dword_60106C 覆盖 6c-68=4,所以: from pwn imp ...

  2. [CSP-S模拟测试]:数字(数学+高精度)

    题目描述 很简单,给出正整数$n$,求出$n!$在十进制表示下的从最末非零位开始的总共$k$位. 输入格式 第一行一个正整数$T$,表示有$T$组数据接下来$T$行,每行两个正整数$n$和$k$. 输 ...

  3. python&数据分析&数据挖掘--参考资料推荐书籍

    1.要用python做数据分析,先得对python语言熟悉,推荐一本入门书 :笨方法学python (learn python the hard way),这本书用非常有趣的讲述方式介绍了python ...

  4. IBatis.Net 下使用SqlBulkCopy 大批量导入数据 问题解决

    SQLBulkCopy是继承SQLClient空间下的一个特殊类,它可以帮助我们以映射的方式把DataTable和DataReader数据大批量导入到数据库对应表中 public void Inert ...

  5. 第九届ECNU Coder K.计软联谊

    题目链接:http://acm.ecnu.edu.cn/contest/16/problem/K/ 题目: K. 计软联谊 Time limit per test: 7.0 seconds Time ...

  6. jsc2019_qualE Card Collector

    题目大意 给你n个点的坐标和权值 问先在每一行选一个点再在每一列选一个没选过的点 求最大权值和 分析 可以想到将点转化为边,将两个坐标对应两个点 所以问题转化为选H+W个边 使得所有边的度都不为0 则 ...

  7. 121、TensorFlow张量命名

    # tf.Graph对象定义了一个命名空间对于它自身包含的tf.Operation对象 # TensorFlow自动选择一个独一无二的名字,对于数据流图中的每一个操作 # 但是给操作添加一个描述性的名 ...

  8. scrapy-redis源码浅析

    原文链接 前言 分析这个项目的源码原因是需要有去重过滤,增量爬取两个功能,而scrapy-redis项目已经帮我们实现了,想看看他是怎么实现的.这里只贴出部分主要代码,查看时请打开源码对照,笔记有点长 ...

  9. ucenter 验证码看不到的解决办法

    ucenter 验证码看不到的解决办法,很简单,很实用,本人亲试成功~http://www.jinyuanbao.cn 把images /fonts /en 的ttf 刪除可以了!

  10. Python模块之pdfkit

    1.安装依赖 pip install python-docx #Python下的Microsoft Word 2007工具 pip install PyPDF2 #Python下的PDF工具 pip ...