1+ #include < bits/stdc++.h>
2+
3+ using namespace std ;
4+
5+ constexpr int inf = numeric_limits<int >::max();
6+
7+ struct Hungarian {
8+ Hungarian (int n_, int m_) :
9+ n (n_), m(m_), at(1 ), u(n_+1 ), v(m_+1 ), p(m_+1 ), way(m_+1 ) {}
10+
11+ Hungarian (vector<vector<int >> const & v) :
12+ n ((int )v.size() - 1 ), m((int )v[0 ].size() - 1 ), at(1 ),
13+ u (n+1 ), v(m+1 ), p(m+1 ), way(m+1 )
14+ {
15+ for (int i = 1 ; i <= n; i++) {
16+ add_row (v[i]);
17+ }
18+ }
19+
20+ void add_row (vector<int > const & a) {
21+ p[0 ] = at++;
22+ int j0 = 0 ;
23+ vector<int > minv (m+1 , inf);
24+ vector<char > used (m+1 , false );
25+
26+ do {
27+ used[j0] = true ;
28+ int i0 = p[j0], delta = inf, j1;
29+ for (int j = 1 ; j <= m; j++) {
30+ if (!used[j]) {
31+ int cur = a[j] - u[i0] - v[j];
32+ if (cur < minv[j])
33+ minv[j] = cur, way[j] = j0;
34+ if (minv[j] < delta)
35+ delta = minv[j], j1 = j;
36+ }
37+ }
38+ for (int j = 0 ; j <= m; j++) {
39+ if (used[j])
40+ u[p[j]] += delta, v[j] -= delta;
41+ else
42+ minv[j] -= delta;
43+ }
44+ j0 = j1;
45+ } while (p[j0] != 0 );
46+
47+ do {
48+ int j1 = way[j0];
49+ p[j0] = p[j1];
50+ j0 = j1;
51+ } while (j0);
52+ }
53+
54+ vector<int > get_ans () {
55+ vector<int > ans (at);
56+ for (int j=1 ; j <= m; j++) {
57+ ans[p[j]] = j;
58+ }
59+ return ans;
60+ }
61+
62+ private:
63+ int n, m, at;
64+ vector<int > u, v, p, way;
65+ };
66+
67+ int main () {
68+ int n = 3 , m = 4 ;
69+
70+ Hungarian h (n, m);
71+
72+ auto print_ans = [] (auto & h) {
73+ auto res = h.get_ans ();
74+ for (int i = 1 ; i < (int )res.size (); i++) {
75+ cout << res[i] << " " ;
76+ }
77+ cout << " \n " ;
78+ };
79+
80+ h.add_row ({0 , 1 , 2 , 3 , 1 });
81+ print_ans (h);
82+
83+ h.add_row ({0 , 1 , 2 , 3 , 1 });
84+ print_ans (h);
85+
86+ h.add_row ({0 , 1 , 2 , 3 , 0 });
87+ print_ans (h);
88+ }
0 commit comments