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

题意:

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

分析:

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

解题思路:

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

代码:

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

View Code

转载于:https://www.cnblogs.com/beisong/p/4032919.html

hdu 4619 Warm up 2 (二分匹配)相关推荐

  1. HDU 4619 Warm up 2 (多校)

    题意:在网格里面给定了 横,竖 两种多米诺骨牌,同向的不可以覆盖,不同向的可以覆盖,问你最多去掉多少个有覆盖的多米诺,使得网格内剩余的多米诺骨牌最多 解题思路: 一.搜索 (1),分别对横竖两种不同的 ...

  2. HDU 4619 Warm up 2 最大独立集

    Warm up 2 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4619 Description Some 1×2 dominoes are pla ...

  3. hdu 1150 Machine Schedule (经典二分匹配)

    //A组n人 B组m人 //最多有多少人匹配 每人仅仅有匹配一次 # include<stdio.h> # include<string.h> # include<alg ...

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

    把相互覆盖的骨牌放入一个集合中,如果一个集合有cnt 个元素  那么这个集合所在区域最多只能存在 (cnt +1)/2 个元素. #include <iostream> #include ...

  5. hdu 1054 Strategic Game 最小点覆盖 = 最大二分匹配

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1054 简单二分匹配,根据题意构造一个无向图.然后求最小点覆盖,然后扫描mark数组将曾经匹配的点所匹配 ...

  6. 【HDU 2255】奔小康赚大钱 (最佳二分匹配KM算法)

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  7. hdu 1281棋盘游戏(二分匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 Problem Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格 ...

  8. HDU - 3081 Marriage Match II 【二分匹配】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3081 题意 有n对男女 女生去选男朋友 如果女生从来没和那个男生吵架 那么那个男生就可以当她男朋友 女 ...

  9. hdu 5093 二分匹配

    /* 题意:给你一些冰岛.公共海域和浮冰,冰岛可以隔开两个公共海域,浮冰无影响 求选尽可能多的选一些公共海域点每行每列仅能选一个. 限制条件:冰山可以隔开这个限制条件.即*#*可以选两个 预处理: * ...

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

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

最新文章

  1. CentOS 7.0编译安装Nginx+MySQL+PHP
  2. test_bit、set_bit和clear_bit
  3. 15.4. syslog, klogctl - read and/or clear kernel message ring buffer; set console_loglevel
  4. 数据可视化(BI报表的开发)第三天
  5. android sdk 封装html5,Android平台以WebView方式集成HTML5+SDK方法
  6. 页面无法访问 css文件加载问题
  7. LeetCode(107)——二叉树的层次遍历 II(JavaScript)
  8. HAXM 6.0.5显示不兼容Windows
  9. 简析struct in_addr ,struct sockadd
  10. 人在年轻的时候,最核心的能力是什么?-复利(转自知乎)
  11. 彻底清除计算机磁盘上的病毒,电脑硬盘病毒无法彻底删除怎么办
  12. 个人邮箱怎么注册?手机怎么注册个人邮箱呢?
  13. HDU5442(字符串的最大表示法或者后缀数组)
  14. 计算机 不识u盘,电脑不认u盘了怎么办?
  15. Jquery颜色选择插件使用
  16. epub to mobi转换器
  17. php中文数组按拼音排序问题
  18. ngrok域名申请使用外网访问
  19. Unreal Engine 4(UE4)下载教程
  20. 2022小木虫与研招网调剂监视脚本

热门文章

  1. ES6的类Class基础知识点
  2. mina在spring中的配置多个端口
  3. HDOJ 1394 Minimum Inversion Number(线段树求逆序数对)
  4. 阿里P8架构师谈:如何搭建亿级并发系统的性能指标体系
  5. Setup JIRA Service Desk 3.9.2 on Oracle Linux 6.8
  6. linux下面桌面的安装
  7. vs2005中分割线怎么插入
  8. java多线程 Java核心技术 读书笔记
  9. Oracle Database 11g 下载
  10. oracle patch下载地址