HDU 1150 Machine Schedule (最小覆盖,匈牙利算法)
题意:
有两台不同机器A和B,他们分别拥有各种运行模式1~n和1~m。现有一些job,需要在某模式下才能完成,job1在A和B上需要的工作模式又可能会不一样。两台机器一开始处于0模式,可以切换模式,但是仅在0模式才有切换权,可以通过重启机器回到0模式。现在有一堆job,要多少次重启机器才可以完成任务。
思路:
分析下,很明显,只要求重启次数,那么和时间无关(可以完全由1个机器来干活),只要同个模式的任务能在一块执行掉就节省重启次数了,所有模式一样的任务只耗费1次重启。但是两台机器协作可能重启次数更少,比如在1模式下,B能执行掉2个任务,但是这两个任务需要在A机器上的两种不同模式下才能执行。
我们的目的是尽量让某一个机器的一种模式能够尽可能多的完成这样的一些任务,这些任务需要在另一台机器的多种模式下完成。
可以这样建模:左边是S集{机器A的每种模式为1个点},所以有n种模式。右边是T集{机器B的每种模式为1个点},所以有m种模式。每个任务作为一条边,连接S和T上的对应模式。
按最坏情况考虑,只需要将n+m种模式都运行一次,必定可以解决所有的任务。但是为了节省重启次数,只需要挑出部分的点,能覆盖到所有的边(边即任务)。这样的模型就是二分图的最小点覆盖了。
求最小点覆盖的定义:对于图G=(V,E)中的一个包含最少的点的集合S⊆V,E中每一条边至少有一个端点在S中。
根据konig定理,最小点覆盖数=最大匹配数。那么求二分图的最大匹配就行了,可以用匈牙利算法,代码少。(匈牙利算法看“知识科普”分类)
直接变成了男女配对的模型,A的模式是都是男的,B的模式都是女的。
#include <bits/stdc++.h>
using namespace std;
const int N=;
int n ,m, k, r, a, b; bool mapp[N][N]; //矩阵
bool match[N]; //用于找路径,走过的点被标记
bool vis[N]; //标记女的是否已经被匹配了
int girl[N]; //假设B为女的 //假设A为男,B为女
int find(int x) //为x找女对象
{
for(int i=; i<=m; i++) //扫描所有妹子
{
if( mapp[x][i] && !match[i] ) //认识的,还没有尝试过帮这个妹子另外找过对象
{
match[i]=; //这个妹子已经试图帮她找过对象了
if(!vis[i] || find(girl[i]))
{
girl[i]=x; //如果能为妹子男朋友另找对象,那么这个妹子就是我的了
vis[i]=;
return true;
}
}
}
return false;
} int hungary()
{
int cnt=;
for(int i=; i<=n; i++)
{
memset(match,,sizeof(match));
if(find(i)) cnt++; //又一个匹配了
}
return cnt;
} int main()
{
freopen("input.txt", "r", stdin);
while(scanf("%d",&n), n)
{
scanf("%d%d",&m,&k);
memset(mapp,,sizeof(mapp));
memset(vis,,sizeof(vis));
memset(girl,,sizeof(girl));
for(int i=; i<k; i++)
{
scanf("%d%d%d",&r,&a,&b);
//if(a>0&&b>0)
mapp[a][b]=; //看作有向边,因为男女的编号可能相同的
}
printf("%d\n",hungary()); //匈牙利算法
}
return ;
}
AC代码
HDU 1150 Machine Schedule (最小覆盖,匈牙利算法)的更多相关文章
- hdoj 1150 Machine Schedule【匈牙利算法+最小顶点覆盖】
Machine Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- hdu 1150 Machine Schedule 最小覆盖点集
题意:x,y两台机器各在一边,分别有模式x0 x1 x2 ... xn, y0 y1 y2 ... ym, 现在对给定K个任务,每个任务可以用xi模式或者yj模式完成,同时变换一次模式需要重新启动一次 ...
- 匈牙利算法模板 hdu 1150 Machine Schedule(二分匹配)
二分图:https://blog.csdn.net/c20180630/article/details/70175814 https://blog.csdn.net/flynn_curry/artic ...
- hdu 1150 Machine Schedule(二分匹配,简单匈牙利算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1150 Machine Schedule Time Limit: 2000/1000 MS (Java/ ...
- hdu 1150 Machine Schedule(最小顶点覆盖)
pid=1150">Machine Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/327 ...
- 二分图最大匹配(匈牙利算法)简介& Example hdu 1150 Machine Schedule
二分图匹配(匈牙利算法) 1.一个二分图中的最大匹配数等于这个图中的最小点覆盖数 König定理是一个二分图中很重要的定理,它的意思是,一个二分图中的最大匹配数等于这个图中的最小点覆盖数.如果你还不知 ...
- hdu 1150 Machine Schedule hdu 1151 Air Raid 匈牙利模版
//两道大水……哦不 两道结论题 结论:二部图的最小覆盖数=二部图的最大匹配数 有向图的最小覆盖数=节点数-二部图的最大匹配数 //hdu 1150 #include<cstdio> #i ...
- hdu 1150 Machine Schedule 最少点覆盖转化为最大匹配
Machine Schedule Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...
- hdu 1150 Machine Schedule 最少点覆盖
Machine Schedule Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...
随机推荐
- [转载]淘宝API调用 申请 获取session key
http://www.cnblogs.com/zknu/archive/2013/06/14/3135527.html 在调用淘宝的API时,我们都会用到appkey,appsecret,appses ...
- 关闭VS时, 每次都 会弹出 保存以下各项的更改吗?
如果是添加项目, 或修改了解决方案的配置, 会弹出这个是正常的. 如果在没有修改的情况下还这样就是有问题的. 原因: 在Vs中安装了PowerDesigner插件, 并在VS中点了该插件的东西 ...
- 基于HOOK和MMF的Windows密码渗透技术
随着计算机与网络的普及,信息安全越来越成为人们所普遍关心的大事.密码的渗透与反渗透在此领域表现的愈演愈烈.本文深入分析了各个版本Windows密码的特点,尤其是针对windws2K/XP安全性提高的情 ...
- 一个简单的PHP登录演示(SESSION版 与 COOKIE版)
//==============COOKIE版本的简单登录================ if ($_GET[out]){ setcookie('id',''); setcookie('pw','' ...
- 暑假集训单切赛第一场 POJ 2309 BST(找规律的题)
题意:给出一棵二分搜索树,再给一个节点编号n,求以这个节点为根节点的子树叶子节点的最大值与最小值. 首先求n所在的层数,他的层数就是他的因子中2的个数(规律). n的左右各有num=2^i-1个数.最 ...
- js注册验证【转】
function getFocus() //设置用户名文本框获取焦点 { document.getElementById("txtuname").focus(); } functi ...
- IText 生成页脚页码
做doc文档报表的时候可能遇到这样的需求: 每一个页面需要页码,用IText可以完成这样的需求. IText生成doc文档需要三个包:iTextAsian.jar,iText-rtf-2.1.4.ja ...
- U盘安装Win7 64位
试了好几遍,失败了的就不说了,直接记下成功的方案,方便下次. 方法为:用UltraISO刻镜像文件到U盘,然后U盘启动安装. 具体如下: 刻u盘之前一定要验证iso镜像的完整性啊(可以用文件校验工具与 ...
- Java快速排序 分别以数组0位作为基准 和最后一位作为基准的排序演示
package util; public class Pub { public static void beforeSort(int[] arr){ System.out.println(" ...
- Linux功能-RPM命令详解
一.概述 RPM是RedHat Package Manager(RedHat软件包管理工具)类似Windows里面的“添加/删除程序”,用RPM包方式来发布软件变得越来越流行,主要的原因是这种软件发布 ...