UVa 1194 - Machine Schedule

contents

  1. 1. Problem
  2. 2. Input
  3. 3. Output
  4. 4. Sample Input
  5. 5. Sample Output
  6. 6. Solution

Problem

As we all know, machine scheduling is a very classical problem in computer science and has been studied for a very long history. Scheduling problems differ widely in the nature of the constraints that must be satisfied and the type of schedule desired. Here we consider a 2-machine scheduling problem.

There are two machines A and B . Machine A has n kinds of working modes, which is called mode0 , mode1 , … , moden-1 , likewise machine B has m kinds of working modes, mode0 , mode1 , … , modem-1 . At the beginning they are both work at mode0 .

For k jobs given, each of them can be processed in either one of the two machines in particular mode. For example, job 0 can either be processed in machine A at mode3 or in machine B at mode4 , job 1 can either be processed in machine A at mode2 or in machine B at mode4 , and so on. Thus, for job i, the constraint can be represent as a triple (i, x, y) , which means it can be processed either in machine A at modex , or in machine B at modey .

Obviously, to accomplish all the jobs, we need to change the machine’s working mode from time to time, but unfortunately, the machine’s working mode can only be changed by restarting it manually. By changing the sequence of the jobs and assigning each job to a suitable machine, please write a program to minimize the times of restarting machines.

Input

The input file for this program consists of several configurations. The first line of one configuration contains three positive integers: n , m (n, m < 100) and k (k < 1000) . The following k lines give the constrains of the k jobs, each line is a triple: i, x, y .

The input will be terminated by a line containing a single zero.

Output

The output should be one integer per line, which means the minimal times of restarting machine.

Sample Input

1
2
3
4
5
6
7
8
9
10
11
12
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

Sample Output

1
3

Solution

題目描述:

有兩台機器 A, B,各自擁有 n 和 m 個模式,在 k 個工作中,每一個工作可以在 A 機器的 a 模式或者是 B 機器的 b 模式下完成。

一開始兩台機器皆處於模式 0,而轉換模式是很費時間,希望轉換次數越少越好來完成所有工作。

題目解法:

由於一開始處於模式 0,所以工作在模式 0 下可以完成的全部忽略!

接著考慮建二分圖,分別對每一個工作所需要的模式 a, b 拉邊,最後會採用最少點集覆蓋所有條邊即可。

二分圖最少點集覆蓋 = 二分圖最大匹配數

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <queue>
using namespace std;
struct Node {
int y;
int next;
} edge[10005];
int e, head[105];
void addEdge(int x, int y) {
edge[e].y = y;
edge[e].next = head[x], head[x] = e++;
}
int mx[105], my[105], used[105];
int dfs(int now) {
int i, x;
for(i = head[now]; i != -1; i = edge[i].next) {
x = edge[i].y;
if(!used[x]) {
used[x] = 1;
if(my[x] == -1 || dfs(my[x])) {
mx[now] = x, my[x] = now;
return 1;
}
}
}
return 0;
}
int main() {
int N, M, K, u, v;
while(scanf("%d %d %d", &N, &M, &K) == 3 && N) {
e = 0;
memset(head, -1, sizeof(head));
for(int i = 0; i < K; i++) {
scanf("%*d %d %d", &u, &v);
if(u > 0 && v > 0)
addEdge(u, v);
}
memset(mx, -1, sizeof(mx));
memset(my, -1, sizeof(my));
int match = 0;
for(int i = 0; i < N; i++) {
if(mx[i] == -1) {
memset(used, 0, sizeof(used));
if(dfs(i))
match++;
}
}
printf("%d\n", match);
}
return 0;
}