问题描述
众所周知,机器调度是计算机科学中的一个非常经典的问题,并且已经有很长的历史了。调度问题在必须满足的约束的性质和所需的调度类型方面差异很大。在这里,我们考虑两机调度问题。
机器A和B有两个。机器A有n种工作模式,称为mode_0,mode_1,…,mode_n-1,同样,机器B也有m种工作模式,mode_0,mode_1,…,mode_m-1。一开始它们都在mode_0下工作。
对于给定的k个作业,可以在特定模式下在两台机器中的任何一台中对其进行处理。例如,作业0可以在机器A的mode_3或B的机器上以mode_4进行处理,作业1可以在机器A的mode_2或在机器B中在mode_4进行处理,依此类推。因此,对于作业i,约束可以表示为三元组(i,x,y),这意味着可以在机器A中以mode_x或在机器B中以mode_y对其进行处理。
显然,要完成所有工作,我们需要不时更改机器的工作模式,但是不幸的是,只能通过手动重新启动机器来更改机器的工作模式。通过更改作业顺序并将每个作业分配给合适的计算机,请编写程序以最大程度地减少重新启动计算机的时间。
输入值
该程序的输入文件由几种配置组成。一个配置的第一行包含三个正整数:n,m(n,m <100)和k(k <1000)。以下k行给出了k个作业的约束,每行是一个三元组:i,x,y。输入将由包含单个零的行终止。
输出量
输出应该是每行一个整数,这意味着重新启动计算机的最少时间。
样本输入
5 5 10
0 1 1
1 1 2
2 1 3
3 1 4
4 2 1
5 2 2
6 2 3
7 2 4
8 3 3
9 4 3
0
样本输出
3
资源
2002亚洲,北京(中国大陆)
- 这题的目的就是为了求最大匹配的值
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<math.h>
#include<string.h>
#include<sstream>
using namespace std;
int n, m, t;
int map[105][105];
int link[105];//男方
int useif[105];//vis数组
bool can(int u) {
for(int i = 1; i <= m; i ++){
if(useif[i] == 0 && map[u][i]){//本次循环dfs,并且互相喜欢
useif[i] = 1;
if(link[i] == -1 || can(link[i])){
//男方还没被匹配,或者让男人去找找别的女方
link[i] = u;
return 1;
}
}
}
return 0;
}
int main() {
//ios::sync_with_stdio(false);
while(cin >> n && n){
memset(map,0,sizeof(map));
memset(link,-1,sizeof(link));
cin >> m >> t;
int index,a, b;
for(int i = 1; i <= t; i ++){
cin >> index >> a >> b;
map[a][b] = 1;
}
int ans = 0;
for(int i = 1; i <= n; i ++){
memset(useif,0,sizeof(useif));
if(can(i))ans ++;//把男方放进去跑循环
}
cout << ans << endl;
}
return 0;
}