该题是经典的二分图匹配的应用,题义是这样的。给定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 二分图匹配相关推荐

  1. HDU - 1150 Machine Schedule(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:现在有一个机器A和一个机器B,A机器有n种模式,B机器有m种模式,现在有k次工作需要完成,每次工作的信息为: id x y:编号为id,在A机器要用x模式完成,在B机器要 ...

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

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

  3. POJ-1325 Machine Schedule 二分图匹配 最小点覆盖问题

    POJ-1325 题意: 有两台机器A,B,分别有n,m种模式,初始都在0模式,现在有k项任务,每项任务要求A或者B调到对应的模式才能完成.问最少要给机器A,B调多少次模式可以完成任务. 思路: 相当 ...

  4. POJ 1325 Machine Schedule[二分图匹配*最小点覆盖]

    题意: 两台机器,有 k 个工作,每个工作可以在 a 机器的 P 模式或在 b 机器的 q 模式下解决,两台机器初始状态为 0 模式,每台机器没变换一次模都要重启一次, 问至少重启多少次可以完成所有工 ...

  5. HDU 2819 Swap(二分图匹配)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=2819 [题目大意] 给出一个棋盘,由白格子和黑格子组成,可以交换棋盘的行列, 使得其主对角线为黑格 ...

  6. POJ 1325 Machine Schedule(二分图最小点集覆盖)

    题目链接:http://poj.org/problem?id=1325 题意:A机器有n个模式,B机器有m个模式,有k个任务,第i个任务可以用A机器的ai模式或者B机器的bi模式,换模式需要重启,开始 ...

  7. 【HDOJ】1150 Machine Schedule

    匈牙利算法. 1 #include <stdio.h> 2 #include <string.h> 3 4 #define MAXNUM 1005 5 6 char map[M ...

  8. HDU 2063 过山车 (二分图匹配之匈牙利算法)

    过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  9. 【 HDU - 5093】Battle ships(匈牙利算法,二分图匹配)

    题干: Dear contestant, now you are an excellent navy commander, who is responsible of a tough mission ...

  10. HDU 2444 The Accomodation of Students 二分图匹配

    HDU 2444 The Accomodation of Students 二分图匹配 题目来源: HDU 题意: 给出学生数n和关系数m,接下来给出m个关系. 要求将学生分成两部分,每一部分不能有互 ...

最新文章

  1. php phar,PHP中phar(PHP Archive)包的创建并使用
  2. 【转】服务发现:Zookeeper vs etcd vs Consul
  3. Oracle10g在Win2008R2下因版本无法安装问题的解决
  4. 在IDEA中调试JavaScript代码
  5. 计算机有残留office,电脑残留Office无法重装?电脑完全卸载Office方法
  6. python截图并识别文字
  7. astc纹理压缩格式
  8. The retrospective material for unit_4 Survival
  9. 论文阅读:Factoring Statutory Reasoning as Language Understanding Challenges
  10. 中国互联网老总的经典妙语语录
  11. 如何用python制作一张节日贺卡
  12. python毕业设计作品基于django框架的鲜花水果商城毕设成品(3)后台管理功能
  13. 多家快递如何同时批量查询呢
  14. node 简介及安装
  15. 电热水器洗澡时注意(特别是需要拔插头)
  16. 判断字符串字符种类及个数
  17. 相机和镜头选择时的一些参数
  18. 很适合装逼的代码(Lambda表达式)
  19. 为什么导师眼里差劲的硕士生能够找到好工作?
  20. 显卡驱动卸载清理工具

热门文章

  1. 【算法笔记】对两种线性基的理解
  2. Linux中断函数堆栈,Linux在执行信号处理的过程中对堆栈的处理
  3. 安装版mysql数据库data在_MySQL 5.7版本的安装使用详细教程+更改数据库data的存储路径...
  4. php mysql日期区间_php – 3个日期范围之间的Mysql查询
  5. 已经编译好的OpenCV4.5.1----win10(cuda10.0 cudnn7.6.5)
  6. matlab里的timer,关于Matlab中用timer来实现多线程机制
  7. linux内存和缓冲区,Linux上怎么清除缓存、缓冲区和交换区空间?
  8. 翻译: 3.3. 线性回归的简明实现 pytorch
  9. 算法:链表最快的排序方法,分而治之再合并排序
  10. 程序员提升编码技能的秘密