1. 程式人生 > >Machine Schedule(二分圖匹配之最小覆蓋點,匈牙利算法)

Machine Schedule(二分圖匹配之最小覆蓋點,匈牙利算法)

進行 begin 最小 uitable size 了解 been computer his

個人心得:二分圖啥的一點都不知道,上網借鑒了下,請參考http://blog.csdn.net/thundermrbird/article/details/52231639

加上自己的了解,二分圖就是將圖形拆分成倆半,倆邊的點通過邊界相連接。匹配就是不存在倆條邊存在同一頂點,就是一個頂點最多連接一條邊。

匈牙利算法就是用增廣路進行更新,仔細一想確實如此,如果存在這樣的途徑那麽必然可以用亦或就行維護更新,細節看參考。

不過礙於自己圖論太low,還是無法運用的好,比如這題,就是最小覆蓋點,關於最小覆蓋點等於最大匹配數還沒搞明白。

總的來說這就是給我提供一個二分最大匹配的模板吧,算法細節方面有時間還是要去學的,不能單純為了做題而學習算法!

勵誌語:沒什麽能夠打倒你,能打倒你的只有你的自卑和懦弱。前方大路終究變得寬闊,加油。

題目:

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 mode_0, mode_1, ..., mode_n-1, likewise machine B has m kinds of working modes, mode_0, mode_1, ... , mode_m-1. At the beginning they are both work at mode_0.

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 mode_3 or in machine B at mode_4, job 1 can either be processed in machine A at mode_2 or in machine B at mode_4, 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 mode_x, or in machine B at mode_y.

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

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

3
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<vector>
 6 #include<queue>
 7 #include<string>
 8 #include<algorithm>
 9 using namespace std;
10 const int inf=0x3f3f3f3f;
11 const int maxa=105;
12 int g[maxa][maxa];
13 int book[maxa];
14 int link[maxa];
15 int n,m,k;
16 int dfs(int u){
17         int v;
18         for(v=0;v<m;v++)
19              if(g[u][v]&&!book[v])
20         {
21             book[v]=1;
22             if(link[v]==-1||dfs(link[v]))
23             {
24                 link[v]=u;
25                 return 1;
26             }
27         }
28         return 0;
29 }
30 int hungary()
31 {
32     int res=0;
33     int u;
34     memset(link,-1,sizeof(link));
35     for(int i=0;i<n;i++)
36     {
37         memset(book,0,sizeof(book));
38         if(dfs(i)) res++;
39     }
40     return res;
41 }
42 int main(){
43     while(cin>>n){
44         if(n==0) break;
45         memset(g,0,sizeof(g));
46         cin>>m>>k;
47         int x,y,z;
48         while(k--){
49             cin>>x>>y>>z;
50             if(y>0&&z>0) g[y][z]=1;
51         }
52         cout<<hungary()<<endl;
53 
54     }
55 
56     return 0;
57 }



Machine Schedule(二分圖匹配之最小覆蓋點,匈牙利算法)