题意翻译

有两台机器 A,B 分别有 n,m 种模式。

现在有 k 个任务。对于每个任务 i ,给定两个整数$ a_i\(和\) b_i$,表示如果该任务在 A上执行,需要设置模式为 \(a_i\);如果该任务在 B** 上执行,需要设置模式为$ b_i$。

每台机器第一次开机默认处在0模式,且第一次开机不需要消耗时间。任务可以以任意顺序被执行,但每台机器转换一次模式就要重启一次。求怎样分配任务并合理安排顺序,能使机器重启次数最少。

1 \leq n,m \leq 1001≤n,m≤100,1 \leq k \leq 10001≤k≤1000,1 \leq a_i \leq n1≤a**in,1 \leq b_i \leq m1≤b**im

可能有多组数据。

解析

二分图最小点覆盖。

容易看出,这就是一张二分图,A、B的不同模式分别是左部和右部的点。

我们要解决的问题是,对于任意一个任务,我们可以把它看作一条边。对于这条边,我们必须要选择二分图中任意一部的点,即最小点覆盖。

定理

二分图最小点覆盖包含点数=二分图最大匹配数

根据这个定理,我们用匈牙利求最大匹配就行。

参考代码

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<bitset>
#define N 1010
using namespace std;
int n,m,k,f[N];
vector<int> g[N];
bitset<N> v;
inline bool dfs(int x)
{
for(int i=0;i<g[x].size();++i){
int y=g[x][i];
if(v[y]) continue;
v[y]=1;
if(!f[y]||dfs(f[y])){
f[y]=x;
return 1;
}
}
return 0;
}
int main()
{
while(~scanf("%d",&n)&&n!=0){
for(int i=1;i<=n;++i) g[i].clear();
v.reset();memset(f,0,sizeof(f));
scanf("%d%d",&m,&k);
while(k--){
int num,u,v;
scanf("%d%d%d",&num,&u,&v);
g[u].push_back(v+n),g[v+n].push_back(u);
}
getchar();
int ans=0;
for(int i=1;i<=n;++i){
v.reset();ans+=dfs(i);
}
cout<<ans<<endl;
}
return 0;
}

UVA1194 Machine Schedule[二分图最小点覆盖]的更多相关文章

  1. [poj1325] Machine Schedule (二分图最小点覆盖)

    传送门 Description As we all know, machine scheduling is a very classical problem in computer science a ...

  2. HDU 1150 Machine Schedule (二分图最小点覆盖)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1150 有两个机器a和b,分别有n个模式和m个模式.下面有k个任务,每个任务需要a的一个模式或者b的一个 ...

  3. POJ - 1325 Machine Schedule 二分图 最小点覆盖

    题目大意:有两个机器,A机器有n种工作模式,B机器有m种工作模式,刚開始两个机器都是0模式.假设要切换模式的话,机器就必须的重新启动 有k个任务,每一个任务都能够交给A机器的i模式或者B机器的j模式完 ...

  4. POJ 1325 Machine Schedule(最小点覆盖)

    http://poj.org/problem?id=1325 题意: 两种机器A和B.机器A具有n种工作模式,称为mode_0,mode_1,...,mode_n-1,同样机器B有m种工作模式mode ...

  5. UVA1194 Machine Schedule

    题目地址:UVA1194 Machine Schedule 二分图最小覆盖模型的要素 每条边有两个端点,二者至少选择一个.简称 \(2\) 要素. \(2\) 要素在本题中的体现 每个任务要么在 \( ...

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

    最小点覆盖集就是在一个有向图中选出最少的点集,使其覆盖所有的边. 二分图最小点覆盖集=二分图最大匹配(二分图最大边独立集) 这题A机器的n种模式作为X部的点,B机器的m种模式作为Y部的点: 每个任务就 ...

  7. POJ2226 Muddy Fields(二分图最小点覆盖集)

    题目给张R×C的地图,地图上*表示泥地..表示草地,问最少要几块宽1长任意木板才能盖住所有泥地,木板可以重合但不能盖住草地. 把所有行和列连续的泥地(可以放一块木板铺满的)看作点且行和列连续泥地分别作 ...

  8. hihoCoder #1127:二分图最小点覆盖和最大独立集

    题目大意:求二分图最小点覆盖和最大独立集. 题目分析:如果选中一个点,那么与这个点相连的所有边都被覆盖,使所有边都被覆盖的最小点集称为最小点覆盖,它等于最大匹配:任意两个点之间都没有边相连的最大点集称 ...

  9. [POJ] 2226 Muddy Fields(二分图最小点覆盖)

    题目地址:http://poj.org/problem?id=2226 二分图的题目关键在于建图.因为“*”的地方只有两种木板覆盖方式:水平或竖直,所以运用这种方式进行二分.首先按行排列,算出每个&q ...

随机推荐

  1. Dnsmasq MacOS使用介绍

    Dnsmasq MacOS使用介绍 问题: pc端开发时,需要在/etc/hosts里配置各种本地环境:当开发移动的界面时,除了使用浏览器的"手机模式"查看效果,还可以直接使用手机 ...

  2. [计算机视觉][神经网络与深度学习]R-FCN、SSD、YOLO2、faster-rcnn和labelImg实验笔记

    R-FCN.SSD.YOLO2.faster-rcnn和labelImg实验笔记 转自:https://ask.julyedu.com/question/7490 R-FCN paper:https: ...

  3. idea关闭sonarLint自动扫描

    手动运行SonarLint 停止SonarLint自动检测代码之后,可以使用Ctrl+Shift+S手动运行SonarLint检查代码

  4. USACO19DEC题解

    Bronze A Cow Gymnastics 题目:https://www.luogu.com.cn/problem/P5831 题解:用数组存一下出现位置,O(n^2)枚举一下就好. 代码: #i ...

  5. 为什么k8s引入pod概念?

    为什么k8s引入pod概念? 1.可管理性 有些容器天生需要紧密关联,以pod为最小单位进行调度 扩展 共享资源 管理生命周期 例如: 一个容器写日志,一个容器读取日志进行相关内容的展示 2.通信和资 ...

  6. KAFA架构及其基本概念

    1.目标 - KAFA价格 在我们上一篇Kafka教程中,我们讨论了Kafka用例和应用程序.今天,在这个Kafka教程中,我们将讨论Kafka Architecture.在这篇Kafka Archi ...

  7. c++基础(四)—— 泛型算法

    1.find(first, last, value) 头文件:algorithm 参数:前两个参数是“表示元素范围的迭代器”,第三个是一个值 说明:find 将范围中进行寻找.搜索失败:如果范围中无匹 ...

  8. linux全面详细转载文章

    在网上发现了一位大佬写的linux各种命令.系统.配置等的详细解析,在此转载保留以便学习! 骏马金龙https://www.cnblogs.com/f-ck-need-u/p/7048359.html

  9. DS 图解归并排序

    经典排序三剑客: 归并,堆排,快排. 今天,图解归并,一步步带你手撕代码~ 归并排序,是采用"分而治之"思想的一个典型应用. 分治法精髓: 1.分 --- 将问题分解成若干个规模更 ...

  10. 如何配置php session使用redis集群

    本实例基于phpredis 2.2.8,支持集群处理,php5.3及以上. 1.页面修改: ini_set('session.save_handler', 'rediscluster'); ini_s ...