机器时间表(最大匹配 二分图)

问题描述
众所周知,机器调度是计算机科学中的一个非常经典的问题,并且已经有很长的历史了。调度问题在必须满足的约束的性质和所需的调度类型方面差异很大。在这里,我们考虑两机调度问题。

机器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;
}
发布了46 篇原创文章 · 获赞 5 · 访问量 2659

猜你喜欢

转载自blog.csdn.net/xuhang513/article/details/105136252