Advertisement
Jasir

Hungerian Algo

Nov 10th, 2019
315
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.91 KB | None | 0 0
  1. double a[105][105];
  2.  
  3. void Hungery(int n, int m){
  4.     vector<double> u (n+1), v (m+1);
  5.     vector <int> p (m+1), way (m+1);
  6.     for (int i=1; i<=n; ++i) {
  7.         p[0] = i;
  8.         int j0 = 0;
  9.         vector<double> minv (m+1, inf);
  10.         vector<char> used (m+1, false);
  11.         do {
  12.             used[j0] = true;
  13.             int i0 = p[j0], j1;
  14.             double delta = inf;
  15.             for (int j=1; j<=m; ++j)
  16.                 if (!used[j]) {
  17.                     double cur = a[i0][j]-u[i0]-v[j];
  18.                     if (cur < minv[j])
  19.                         minv[j] = cur,  way[j] = j0;
  20.                     if (minv[j] < delta)
  21.                         delta = minv[j],  j1 = j;
  22.                 }
  23.             for (int j=0; j<=m; ++j)
  24.                 if (used[j])
  25.                     u[p[j]] += delta,  v[j] -= delta;
  26.                 else
  27.                     minv[j] -= delta;
  28.             j0 = j1;
  29.         } while (p[j0] != 0.0);
  30.         do {
  31.             int j1 = way[j0];
  32.             p[j0] = p[j1];
  33.             j0 = j1;
  34.         } while (j0);
  35.     }
  36.     vector<int> ans (n+1);
  37.     for (int j=1; j<=m; ++j)
  38.         ans[p[j]] = j;
  39.     for (int j=1; j<=m; ++j){
  40.         cout << p[j] << " ";
  41.     }
  42.     cout << endl;
  43. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement