3-27 hdu Machine Schedule

问题描述

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

机器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亚洲,北京(中国大陆)

思路:

画出一个二分图两两连线,就会发和不能谈恋爱一样的问题。只要把所有匹配的抓出来,就可以斩断所有的可能性。也就是机器不用去转换。
找出最大的匹配数。

AC代码:

#include<bits/stdc++.h>
using namespace std;
int un,vn,u,v,t,id;
int linker[505];
bool used[505];
int g[505][505];
bool dfs(int u){
    for(int i=0;i<vn;i++){
        if(g[u][i] && !used[i])    //互相喜欢并且没有对象
        {
           used[i]=true;
           if(linker[i]==-1||dfs(linker[i]))//没有对象 或者有别的选择
           {    
               linker[i]=u; 
               return true;
           } 
        }     
    }
    return false ;
}
int hungary(){
    int res=0;
    memset(linker,-1,sizeof linker);
    for(int i=0;i<un;i++){
        memset(used,false,sizeof used);
        if(dfs(i))res++;
    }
    return res;
}
int main(){
  	while(cin>>un){
    	if(un==0)break;
    	memset(g,0,sizeof g);
    	cin>>vn>>t;
	  	for(int i=0;i<t;i++){
			cin>>id>>u>>v;
			if(u!=0&&v!=0){
				g[u][v]=1;
			}
		}
		cout<<hungary()<<endl;
	}  
	return 0;
}
发布了34 篇原创文章 · 获赞 6 · 访问量 1336

猜你喜欢

转载自blog.csdn.net/qq_44669377/article/details/105145618