http://www.cogs.pro/cogs/problem/problem.php?pid=1168
★★ 输入文件:machine.in
输出文件:machine.out
简单对比
时间限制:1 s 内存限制:128 MB
【问题描述】
我们知道机器调度是计算机科学中一个非常经典的问题。调度问题有很多种,具体条件不同,问题就不同。现在我们要处理的是两个机器的调度问题。
有两个机器A和B。机器A有n种工作模式,我们称之为mode_0,mode_l,……,mode_n-1。同样,机器B有m种工作模式,我们称之为mode_0,mode_1,……,mode_m-1。初始时,两台机器的工作模式均为mode_0。现在有k个任务,每个工作都可以在两台机器中任意一台的特定的模式下被加工。例如,job0能在机器A的mode_3或机器B的mode_4下被加工,jobl能在机器A的mode_2或机器B的mode_4下被加工,等等。因此,对于任意的jobi,我们可以用三元组(i,x,y)来表示jobi在机器A的mode_x或机器B的mode_y下被加工。
显然,要完成所有工作,我们需要不时的改变机器的工作模式。但是,改变机器的工作状态就必须重启机器,这是需要代价的。你的任务是,合理的分配任务给适当的机器,使机器的重启次数尽量少。
【输入】
第一行三个整数n,m(n,m<100),k(k<1000)。接下来的k行,每行三个整数i,x,y。
【输出】
只一行一个整数,表示最少的重启次数。
【样例】
machine.in machine.out
5 5 10 3
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
好像做过呃呃呃、、
1 #include <cstring> 2 #include <cstdio> 3 4 int n,m,k,ans; 5 bool vis[110]; 6 int map[110][110],match[110]; 7 8 bool find(int u) 9 { 10 for(int v=1;v<=m;v++) 11 if(!vis[v]&&map[u][v]) 12 { 13 vis[v]=1; 14 if(!match[v]||find(match[v])) 15 { 16 match[v]=u; 17 return true; 18 } 19 } 20 return false; 21 } 22 23 inline void read(int &x) 24 { 25 x=0; register char ch=getchar(); 26 for(;ch>'9'||ch<'0';) ch=getchar(); 27 for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; 28 } 29 30 int AC() 31 { 32 freopen("machine.in","r",stdin); 33 freopen("machine.out","w",stdout); 34 35 read(n),read(m),read(k); 36 for(int u,v,a;k--;map[u][v]=1) 37 read(a),read(u),read(v); 38 for(int i=1;i<=n;i++) 39 { 40 memset(vis,0,sizeof(vis)); 41 if(find(i)) ans++; 42 } 43 printf("%d ",ans); 44 return 0; 45 } 46 47 int Hope=AC(); 48 int main(){;}