HDU 1150 Machine Schedule (最小覆盖,最大匹配安城,图论)

题意:有两台机器,机器A和B,他们分别有各种模式1~n和1~m,现在有一些job,需要在特定机器和特定模式下才能完成,job1在A和B上需要的工作模式又可能会不一样。两台机器一开始在0模式(没有这种任务),某台机器如果要切换模式的话只能重启(即在0模式才有切换权),现在有一堆job,要多少次重启机器才可以完成任务。

思路:

  分析,很明显,只要求重启次数,那么和时间无关(可以完全由1个机器来干活),只要同个模式的任务能在一块执行掉就不用重启来切换模式了,所以模式一样的任务只耗费1次重启。但是两台机器协作可能重启次数更少,比如1模式下B能执行掉2个任务,但是这两个任务需要在A机器上的两种模式下执行,同理A也可能和B一样拥有这样的任务。

  目的是尽量让某一个机器的一种模式能够尽可能多的干掉另一台机器的多种模式(被干掉后其他任务不再含这些模式)。其实,我们是想求最小覆盖:选出一些点(每点代表1种模式),能将所有的边(每条边代表1任务)都覆盖到。根据konig定理,最小覆盖数=最大匹配数。那么求最大匹配就行了,可以用匈牙利算法,代码少。(匈牙利算法看“知识科普”分类)

  直接变成了男女配对的模型,A的模式是都是男的,B的模式都是女的。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=105;
 4 int n ,m, k, r, a, b;
 5
 6 bool mapp[N][N]; //矩阵
 7 bool match[N];  //用于找路径,走过的点被标记
 8 bool vis[N];    //标记女的是否已经被匹配了
 9 int girl[N];    //假设B为女的
10
11
12 //假设A为男,B为女
13 int find(int x) //为x找女对象
14 {
15     for(int i=1; i<=m; i++)   //扫描所有妹子
16     {
17         if( mapp[x][i] && !match[i] )    //认识的,还没有尝试过帮这个妹子另外找过对象
18         {
19             match[i]=1;         //这个妹子已经试图帮她找过对象了
20             if(!vis[i] || find(girl[i]))
21             {
22                 girl[i]=x;  //如果能为妹子男朋友另找对象,那么这个妹子就是我的了
23                 vis[i]=1;
24                 return true;
25             }
26         }
27     }
28     return false;
29 }
30
31 int hungary()
32 {
33     int cnt=0;
34     for(int i=1; i<=n; i++)
35     {
36         memset(match,0,sizeof(match));
37         if(find(i))    cnt++;       //又一个匹配了
38     }
39     return cnt;
40 }
41
42
43 int main()
44 {
45     freopen("input.txt", "r", stdin);
46     while(scanf("%d",&n), n)
47     {
48         scanf("%d%d",&m,&k);
49         memset(mapp,0,sizeof(mapp));
50         memset(vis,0,sizeof(vis));
51         memset(girl,0,sizeof(girl));
52         for(int i=0; i<k; i++)
53         {
54             scanf("%d%d%d",&r,&a,&b);
55             //if(a>0&&b>0)
56                 mapp[a][b]=1;   //看作有向边,因为男女的编号可能相同的
57         }
58         printf("%d\n",hungary());  //匈牙利算法
59     }
60     return 0;
61 }

AC代码

时间: 2024-10-03 14:39:04

HDU 1150 Machine Schedule (最小覆盖,最大匹配安城,图论)的相关文章

hdu 1150 Machine Schedule(二分图-最小顶点覆盖)

Machine Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5424    Accepted Submission(s): 2691 Problem Description As we all know, machine scheduling is a very classical problem in compu

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1150 Machine Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6733    Accepted Submission(s): 3375 Problem Description As we all know, mach

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

pid=1150">Machine Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5424    Accepted Submission(s): 2691 Problem Description As we all know, machine scheduling is a very classical pro

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

Machine Schedule Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1150 Description As we all know, machine scheduling is a very classical problem in computer science and has been studied for a very long history.

hdu 1150 Machine Schedule 最少点覆盖

Machine Schedule Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1150 Description As we all know, machine scheduling is a very classical problem in computer science and has been studied for a very long history.

HDU 1150 Machine Schedule (二分匹配)

Machine Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Description As we all know, machine scheduling is a very classical problem in computer science and has been studied for a very long history. Scheduli

HDU——1150 Machine Schedule

Machine Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9461    Accepted Submission(s): 4755 Problem Description As we all know, machine scheduling is a very classical problem in compu

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

//两道大水……哦不 两道结论题 结论:二部图的最小覆盖数=二部图的最大匹配数 有向图的最小覆盖数=节点数-二部图的最大匹配数 1 //hdu 1150 2 #include<cstdio> 3 #include<iostream> 4 #include<cmath> 5 #include<algorithm> 6 #include<cstring> 7 #include<cstdlib> 8 #include<queue>

hdu - 1150 Machine Schedule (二分图匹配最小点覆盖)

http://acm.hdu.edu.cn/showproblem.php?pid=1150 有两种机器,A机器有n种模式,B机器有m种模式,现在有k个任务需要执行,没切换一个任务机器就需要重启一次, 如果任务i在机器A上执行,A机器需要一个对应的模式A,如果在机器B上执行,机器A需要一个模式B. 一直就是机器A在切换模式,现在让你安排一种合理的任务执行顺序,让机器重启次数最少. 每个任务之间连一条边.二分图的最小顶点覆盖就是求最少的点可以连接所有的边,然后转化成最大匹配即可. 这题就是初始状态