1 int G[N][N];
2 int lx[N], ly[N];
3 int slack[N];
4 int match[N];
5 bool visitx[N], visity[N];
6 int n;
7
8 bool Hungary(int u)
9 {
10 visitx[u] = true;
11 for(int i = 0; i < n; ++i)
12 {
13 if(visity[i])
14 continue;
15 else
16 {
17 if(lx[u] + ly[i] == G[u][i])
18 {
19 visity[i] = true;
20 if(match[i] == -1 || Hungary(match[i]))
21 {
22 match[i] = u;
23 return true;
24 }
25 }
26 else
27 slack[i] = min(slack[i], lx[u] + ly[i] - G[u][i]);
28 }
29 }
30 return false;
31 }
32
33 void KM_perfect_match()
34 {
35 int temp;
36 memset(match, -1, sizeof(match));
37 memset(lx, 0, sizeof(lx));
38 memset(ly, 0, sizeof(ly));
39 for(int i = 0; i < n; ++i)
40 for(int j = 0; j < n; ++j)
41 lx[i] = max(lx[i], G[i][j]);
42 for(int i = 0; i < n; ++i)
43 {
44 for(int j = 0; j < n; ++j)
45 slack[j] = INT_MAX;
46 while(1)
47 {
48 memset(visitx, false, sizeof(visitx));
49 memset(visity, false, sizeof(visity));
50 if(Hungary(i))
51 break;
52 else
53 {
54 temp = INT_MAX;
55 for(int j = 0; j < n; ++j)
56 if(!visity[j])
57 temp = min(temp, slack[j]);
58 for(int j = 0; j < n; ++j)
59 {
60 if(visitx[j])
61 lx[j] -= temp;
62 if(visity[j])
63 ly[j] += temp;
64 else
65 slack[j] -= temp;
66 }
67 }
68 }
69 }
70 }