Advertisement
peltorator

Hungarian Algorithm

Apr 23rd, 2022
1,060
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define sz(a) ((int)((a).size()))
  3.  
  4. using namespace std;
  5. typedef long long ll;
  6.  
  7. int32_t main() {
  8.     ios::sync_with_stdio(0);
  9.     cin.tie(0);
  10.     int n;
  11.     cin >> n;
  12.     vector<vector<int>> a(n, vector<int>(n, 0));
  13.     for (int i = 0; i < n; i++) {
  14.         for (int j = 0; j < n; j++) {
  15.             cin >> a[i][j];
  16.         }
  17.     }
  18.     vector<int> l(n, 0), r(n, 0);
  19.     vector<int> pairl(n, -1), pairr(n, -1);
  20.     const int INF = 1e9 + 7;
  21.     for (int iter = 0; iter < n; iter++) {
  22.         int v = 0;
  23.         while (pairl[v] != -1) {
  24.             v++;
  25.         }
  26.         vector<int> usedl(n, 0), usedr(n, 0);
  27.         vector<int> prev(n, -1);
  28.         usedl[v] = 1;
  29.         vector<pair<int, int>> w(n);
  30.         for (int j = 0; j < n; j++) {
  31.             w[j] = {a[v][j] + l[v] + r[j], v};
  32.         }
  33.         while (true) {
  34.             pair<pair<int, int>, int> opt = {{INF, -1}, -1};
  35.             for (int j = 0; j < n; j++) {
  36.                 if (!usedr[j]) {
  37.                     opt = min(opt, {w[j], j});
  38.                 }
  39.             }
  40.             int curl = opt.first.second, curr = opt.second, x = opt.first.first;
  41.             for (int i = 0; i < n; i++) {
  42.                 if (!usedl[i]) {
  43.                     l[i] += x;
  44.                 }
  45.             }
  46.             for (int j = 0; j < n; j++) {
  47.                 if (!usedr[j]) {
  48.                     r[j] -= x;
  49.                     w[j].first -= x;
  50.                 }
  51.             }
  52.             prev[curr] = curl;
  53.             if (pairr[curr] == -1) {
  54.                 while (curr != -1) {
  55.                     int nxt = pairl[prev[curr]];
  56.                     pairl[prev[curr]] = curr;
  57.                     pairr[curr] = prev[curr];
  58.                     curr = nxt;
  59.                 }
  60.                 break;
  61.             }
  62.             usedl[pairr[curr]] = 1;
  63.             usedr[curr] = 1;
  64.             for (int j = 0; j < n; j++) {
  65.                 w[j] = min(w[j], {a[pairr[curr]][j] + l[pairr[curr]] + r[j], pairr[curr]});
  66.             }
  67.         }
  68.     }
  69.     int ans = 0;
  70.     for (int i = 0; i < n; i++) {
  71.         ans += a[i][pairl[i]];
  72.     }
  73.     cout << ans << '\n';
  74.     for (int i = 0; i < n; i++) {
  75.         cout << i + 1 << ' ' << pairl[i] + 1 << '\n';
  76.     }
  77. }
  78.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement