题意:

  有两台不同机器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 (最小覆盖,匈牙利算法)的更多相关文章

  1. hdoj 1150 Machine Schedule【匈牙利算法+最小顶点覆盖】

    Machine Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  2. hdu 1150 Machine Schedule 最小覆盖点集

    题意:x,y两台机器各在一边,分别有模式x0 x1 x2 ... xn, y0 y1 y2 ... ym, 现在对给定K个任务,每个任务可以用xi模式或者yj模式完成,同时变换一次模式需要重新启动一次 ...

  3. 匈牙利算法模板 hdu 1150 Machine Schedule(二分匹配)

    二分图:https://blog.csdn.net/c20180630/article/details/70175814 https://blog.csdn.net/flynn_curry/artic ...

  4. hdu 1150 Machine Schedule(二分匹配,简单匈牙利算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1150 Machine Schedule Time Limit: 2000/1000 MS (Java/ ...

  5. hdu 1150 Machine Schedule(最小顶点覆盖)

    pid=1150">Machine Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/327 ...

  6. 二分图最大匹配(匈牙利算法)简介& Example hdu 1150 Machine Schedule

    二分图匹配(匈牙利算法) 1.一个二分图中的最大匹配数等于这个图中的最小点覆盖数 König定理是一个二分图中很重要的定理,它的意思是,一个二分图中的最大匹配数等于这个图中的最小点覆盖数.如果你还不知 ...

  7. hdu 1150 Machine Schedule hdu 1151 Air Raid 匈牙利模版

    //两道大水……哦不 两道结论题 结论:二部图的最小覆盖数=二部图的最大匹配数 有向图的最小覆盖数=节点数-二部图的最大匹配数 //hdu 1150 #include<cstdio> #i ...

  8. hdu 1150 Machine Schedule 最少点覆盖转化为最大匹配

    Machine Schedule Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...

  9. hdu 1150 Machine Schedule 最少点覆盖

    Machine Schedule Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...

随机推荐

  1. BZOJ 1051: [HAOI2006]受欢迎的牛 强连通缩点

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1051 题解: 强连通缩点得到DAG图,将图转置一下,对入度为零的点跑dfs看看能不能访问 ...

  2. 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  3. java 使用 comet4j 主动向客户端推送信息 简单例子

    [背景] 今天,一个前端的师弟问我怎样做实时聊天窗口,我毫不犹豫地说:在前台定时访问服务端呀!师弟默默地百度了一番,最后告诉我,有一种技术是后服务端动推送信息给客户端的,这种技术的名字叫comet,我 ...

  4. CSS function--功能样式

    功能样式,从常用样式方法中抽离,按需使用,使用前请先阅读 CSS规范 中相关条列. /* function */ .f-cb:after,.f-cbli li:after{display:block; ...

  5. WPF 显示初始化界面

    今天在看<WPF编程宝典>时,看到了Application类,该类可以做很多事情,我认为比较实用的是显示初始化界面,因为之前有个项目在打开的时候要加载好多dll,非常耗时,让客户等的蛋疼, ...

  6. java poi导入EXCEL xls文件代码

    /** * */ package com.bn.car.common.report.excel; import java.io.FileInputStream; import java.io.IOEx ...

  7. hdoj 2544 最短路

    题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=2544 分析:Dijkstra算法 //2013-10-30 10:01:25 Accepted 254 ...

  8. C Primer Plus之高级数据表示

     抽象数据类型(ADT)    类型是由什么组成?一个类型(type)指定两类信息:一个属性集和一个操作集. 所以您想定义一个新的数据类型.首先,您需要提供存储数据的方式,可能是通过设计一个结构.第二 ...

  9. LINQ——语言级集成查询入门指南(1)

    本文主要是对语言级集成查询或简称为LINQ做一个介绍,包括LINQ是什么,不是什么,并对它在语言特性方面做一个简短的回顾,然后举一些使用LINQ的实际例子进行说明. 语言级集成查询是什么? 在我过去写 ...

  10. Linux基础--分类与合并命令

    1.sortsort命令将许多不同的域按不同的顺序分类,sort命令的一般格式为: sort -cmu -o output_file [other options] +pos1 +pos2 input ...