HDU-1150 Machine Schedule 二分图匹配
该题是经典的二分图匹配的应用,题义是这样的。给定K个工作,有两台机器,A机器有N种工作状态,B机器有M种工作状态,对于每一个工作,既可以被A完成又可以被B完成,求完成所有工作至少需要转换多少次模式。
将A以及B的不同模式作为二分图的两个部分,工作作为边,则该题转化为求解最小顶点覆盖来求解。
最小顶点覆盖:包含二分图的X,Y部的部分顶点的一个集合,使得所有的边至少有一个顶点在该点集内。最小顶点覆盖就等于二分图的最大匹配。
证明如下:
设二分图的最大匹配数为M(下图中M等于2),现假设下面的二分图只有 (A,a)以及(C,c)两条边,我们通过增加边来还原至原本的图。这个增加边的过程是不能够使得二分图的匹配数增加的。我们在(A,a)以及(C,c)中选取两点作为最小覆盖点(注意定义,只能这样选),我们选取A,C。现在我们来推翻我们的假设,我们就要增加一些边,使得没有端点在A,C里面(注意不能增加匹配数),刚开始想很简单对吧,我们添加一条边(D,c),呵呵完成了,没有在A,C中,不过这并不能推翻我们的结论,因为A,C是我随机选取的两个点,我可以改变主意了,选择A,c作为最小覆盖点。(B,d)行吗?不行,这样匹配数会增加1了,(A,b),(B,c)和(C,d)行吗?看起是没有增加匹配数,由于A点必须选,C,c也都必须选啊,几轮错了吗? 不需要注意我们也已经增加了匹配数,有了增广路径了。不信,你可以用程序跑一跑。由此特殊性的列子我们得出这个结论应该是靠谱的。(不会严谨的证明,>.<!!!)
A ----- a
B b
C ----- c
D d
得出了结论,代码出来了,注意在0状态是不用统计转换次数的,因为机器本身停留在mode_0
代码如下:
#include <cstdlib>#include <cstring>#include <cstdio> using namespace std;int N, M, K, visit[105], marry[105];int G[105][105]; int path(int u) {for (int i = 0; i < M; ++i) {if (!G[u][i] || visit[i])continue; visit[i] = 1;if (marry[i] == -1 || path(marry[i])) { marry[i] = u;return 1; } }return 0;} int main(){int a, x, y, ans;while (scanf("%d", &N), N) { scanf("%d %d", &M, &K); ans = 0; memset(G, 0, sizeof (G)); memset(marry, 0xff, sizeof (marry));for (int i = 0; i < K; ++i) { scanf("%d %d %d", &a, &x, &y); G[x][y] = 1; }for (int i = 0; i < N; ++i) { memset(visit, 0, sizeof (visit));if (path(i)) { ++ans; } }for (int i = 0; i < M; ++i) {if (marry[i] == 0 && i != 0) { --ans; break; } }if (marry[0] != -1) --ans; printf("%d\n", ans); }return 0;}
转载于:https://www.cnblogs.com/Lyush/archive/2012/03/28/2422060.html
HDU-1150 Machine Schedule 二分图匹配相关推荐
- HDU - 1150 Machine Schedule(最小点覆盖-二分图最大匹配)
题目链接:点击查看 题目大意:现在有一个机器A和一个机器B,A机器有n种模式,B机器有m种模式,现在有k次工作需要完成,每次工作的信息为: id x y:编号为id,在A机器要用x模式完成,在B机器要 ...
- hdu 1150 Machine Schedule (经典二分匹配)
//A组n人 B组m人 //最多有多少人匹配 每人仅仅有匹配一次 # include<stdio.h> # include<string.h> # include<alg ...
- POJ-1325 Machine Schedule 二分图匹配 最小点覆盖问题
POJ-1325 题意: 有两台机器A,B,分别有n,m种模式,初始都在0模式,现在有k项任务,每项任务要求A或者B调到对应的模式才能完成.问最少要给机器A,B调多少次模式可以完成任务. 思路: 相当 ...
- POJ 1325 Machine Schedule[二分图匹配*最小点覆盖]
题意: 两台机器,有 k 个工作,每个工作可以在 a 机器的 P 模式或在 b 机器的 q 模式下解决,两台机器初始状态为 0 模式,每台机器没变换一次模都要重启一次, 问至少重启多少次可以完成所有工 ...
- HDU 2819 Swap(二分图匹配)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=2819 [题目大意] 给出一个棋盘,由白格子和黑格子组成,可以交换棋盘的行列, 使得其主对角线为黑格 ...
- POJ 1325 Machine Schedule(二分图最小点集覆盖)
题目链接:http://poj.org/problem?id=1325 题意:A机器有n个模式,B机器有m个模式,有k个任务,第i个任务可以用A机器的ai模式或者B机器的bi模式,换模式需要重启,开始 ...
- 【HDOJ】1150 Machine Schedule
匈牙利算法. 1 #include <stdio.h> 2 #include <string.h> 3 4 #define MAXNUM 1005 5 6 char map[M ...
- HDU 2063 过山车 (二分图匹配之匈牙利算法)
过山车 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 【 HDU - 5093】Battle ships(匈牙利算法,二分图匹配)
题干: Dear contestant, now you are an excellent navy commander, who is responsible of a tough mission ...
- HDU 2444 The Accomodation of Students 二分图匹配
HDU 2444 The Accomodation of Students 二分图匹配 题目来源: HDU 题意: 给出学生数n和关系数m,接下来给出m个关系. 要求将学生分成两部分,每一部分不能有互 ...
最新文章
- php phar,PHP中phar(PHP Archive)包的创建并使用
- 【转】服务发现:Zookeeper vs etcd vs Consul
- Oracle10g在Win2008R2下因版本无法安装问题的解决
- 在IDEA中调试JavaScript代码
- 计算机有残留office,电脑残留Office无法重装?电脑完全卸载Office方法
- python截图并识别文字
- astc纹理压缩格式
- The retrospective material for unit_4 Survival
- 论文阅读:Factoring Statutory Reasoning as Language Understanding Challenges
- 中国互联网老总的经典妙语语录
- 如何用python制作一张节日贺卡
- python毕业设计作品基于django框架的鲜花水果商城毕设成品(3)后台管理功能
- 多家快递如何同时批量查询呢
- node 简介及安装
- 电热水器洗澡时注意(特别是需要拔插头)
- 判断字符串字符种类及个数
- 相机和镜头选择时的一些参数
- 很适合装逼的代码(Lambda表达式)
- 为什么导师眼里差劲的硕士生能够找到好工作?
- 显卡驱动卸载清理工具
热门文章
- 【算法笔记】对两种线性基的理解
- Linux中断函数堆栈,Linux在执行信号处理的过程中对堆栈的处理
- 安装版mysql数据库data在_MySQL 5.7版本的安装使用详细教程+更改数据库data的存储路径...
- php mysql日期区间_php – 3个日期范围之间的Mysql查询
- 已经编译好的OpenCV4.5.1----win10(cuda10.0 cudnn7.6.5)
- matlab里的timer,关于Matlab中用timer来实现多线程机制
- linux内存和缓冲区,Linux上怎么清除缓存、缓冲区和交换区空间?
- 翻译: 3.3. 线性回归的简明实现 pytorch
- 算法:链表最快的排序方法,分而治之再合并排序
- 程序员提升编码技能的秘密