hdu 4619 Warm up 2 (二分匹配)
题目链接: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 (二分匹配)相关推荐
- HDU 4619 Warm up 2 (多校)
题意:在网格里面给定了 横,竖 两种多米诺骨牌,同向的不可以覆盖,不同向的可以覆盖,问你最多去掉多少个有覆盖的多米诺,使得网格内剩余的多米诺骨牌最多 解题思路: 一.搜索 (1),分别对横竖两种不同的 ...
- HDU 4619 Warm up 2 最大独立集
Warm up 2 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4619 Description Some 1×2 dominoes are pla ...
- hdu 1150 Machine Schedule (经典二分匹配)
//A组n人 B组m人 //最多有多少人匹配 每人仅仅有匹配一次 # include<stdio.h> # include<string.h> # include<alg ...
- hdu 4619 Warm up 2(并查集)
把相互覆盖的骨牌放入一个集合中,如果一个集合有cnt 个元素 那么这个集合所在区域最多只能存在 (cnt +1)/2 个元素. #include <iostream> #include ...
- hdu 1054 Strategic Game 最小点覆盖 = 最大二分匹配
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1054 简单二分匹配,根据题意构造一个无向图.然后求最小点覆盖,然后扫描mark数组将曾经匹配的点所匹配 ...
- 【HDU 2255】奔小康赚大钱 (最佳二分匹配KM算法)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- hdu 1281棋盘游戏(二分匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 Problem Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格 ...
- HDU - 3081 Marriage Match II 【二分匹配】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3081 题意 有n对男女 女生去选男朋友 如果女生从来没和那个男生吵架 那么那个男生就可以当她男朋友 女 ...
- hdu 5093 二分匹配
/* 题意:给你一些冰岛.公共海域和浮冰,冰岛可以隔开两个公共海域,浮冰无影响 求选尽可能多的选一些公共海域点每行每列仅能选一个. 限制条件:冰山可以隔开这个限制条件.即*#*可以选两个 预处理: * ...
- HDU 4685 Prince and Princess(二分匹配加点建图+强连通分量)
题目链接 Problem Description There are n princes and m princesses. Princess can marry any prince. But pr ...
最新文章
- CentOS 7.0编译安装Nginx+MySQL+PHP
- test_bit、set_bit和clear_bit
- 15.4. syslog, klogctl - read and/or clear kernel message ring buffer; set console_loglevel
- 数据可视化(BI报表的开发)第三天
- android sdk 封装html5,Android平台以WebView方式集成HTML5+SDK方法
- 页面无法访问 css文件加载问题
- LeetCode(107)——二叉树的层次遍历 II(JavaScript)
- HAXM 6.0.5显示不兼容Windows
- 简析struct in_addr ,struct sockadd
- 人在年轻的时候,最核心的能力是什么?-复利(转自知乎)
- 彻底清除计算机磁盘上的病毒,电脑硬盘病毒无法彻底删除怎么办
- 个人邮箱怎么注册?手机怎么注册个人邮箱呢?
- HDU5442(字符串的最大表示法或者后缀数组)
- 计算机 不识u盘,电脑不认u盘了怎么办?
- Jquery颜色选择插件使用
- epub to mobi转换器
- php中文数组按拼音排序问题
- ngrok域名申请使用外网访问
- Unreal Engine 4(UE4)下载教程
- 2022小木虫与研招网调剂监视脚本