pku1325 Machine Schedule

有两台机器A,B,分别有n,m个进程,有k个任务,每个任务要么在A的x进程上完成,要么在B的y进程上完成,但机器换进程要时间,求完成方案下的最短时间。

最小覆盖问题,

通式:方案有两个,作为二分图的对立点,而任务为点,完成每一个任务的两种方案连边,求最大匹配即可,因为“最小覆盖=最大匹配”

很不理解输入里面的那个i有什么用??

View Code
 1 program pku1325(input,output);
2 var
3 f : array[0..201,0..201] of boolean;
4 lk : array[0..201] of longint;
5 v : array[0..201] of boolean;
6 n,m,k : longint;
7 procedure init;
8 var
9 i,ii,xx,yy : longint;
10 begin
11 fillchar(f,sizeof(f),false);
12 fillchar(lk,sizeof(lk),0);
13 for i:=1 to k do
14 begin
15 readln(ii,xx,yy);
16 f[xx,yy+n]:=true;
17 end;
18 end; { init }
19 function find(now : longint):boolean;
20 var
21 i : longint;
22 begin
23 for i:=n+1 to n+m do
24 if (not v[i])and(f[now,i]) then
25 begin
26 v[i]:=true;
27 if (lk[i]=0)or(find(lk[i])) then
28 begin
29 lk[i]:=now;
30 exit(true);
31 end;
32 end;
33 exit(false);
34 end; { find }
35 function main():longint;
36 var
37 i : longint;
38 begin
39 main:=0;
40 for i:=1 to n do
41 begin
42 fillchar(v,sizeof(v),false);
43 if find(i) then
44 inc(main);
45 end;
46 exit(main);
47 end; { main }
48 begin
49 read(n);
50 while n<>0 do
51 begin
52 readln(m,k);
53 init;
54 writeln(main);
55 read(n);
56 end;
57 end.



posted @ 2012-03-04 17:31  Codinginging  阅读(169)  评论(0编辑  收藏  举报