BotByte

Hungarain.cpp

Aug 10th, 2018
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.00 KB | None | 0 0
  1. // Hungarian Algorithm
  2. // LightOJ 1198
  3.  
  4. #include <bits/stdc++.h>
  5.  
  6. using namespace std;
  7.  
  8. #define MAX 55
  9. #define INF 12345678
  10. int a[MAX][MAX], n, m, x[MAX], y[MAX];
  11.  
  12. vector<int> hungarain()
  13. {
  14.     vector<int> u (n+1), v (m+1), p (m+1), way (m+1);
  15.     for (int i=1; i<=n; ++i) {
  16.         p[0] = i;
  17.         int j0 = 0;
  18.         vector<int> minv (m+1, INF);
  19.         vector<char> used (m+1, false);
  20.         do {
  21.             used[j0] = true;
  22.             int i0 = p[j0],  delta = INF,  j1;
  23.             for (int j=1; j<=m; ++j)
  24.                 if (!used[j]) {
  25.                     int cur = a[i0][j]-u[i0]-v[j];
  26.                     if (cur < minv[j])
  27.                         minv[j] = cur,  way[j] = j0;
  28.                     if (minv[j] < delta)
  29.                         delta = minv[j],  j1 = j;
  30.                 }
  31.             for (int j=0; j<=m; ++j)
  32.                 if (used[j])
  33.                     u[p[j]] += delta,  v[j] -= delta;
  34.                 else
  35.                     minv[j] -= delta;
  36.             j0 = j1;
  37.         } while (p[j0] != 0);
  38.         do {
  39.             int j1 = way[j0];
  40.             p[j0] = p[j1];
  41.             j0 = j1;
  42.         } while (j0);
  43.     }
  44.     vector<int> ans (n+1);
  45.     for (int j=1; j<=m; ++j)
  46.         ans[p[j]] = j;
  47.     return ans;
  48. }
  49.  
  50. int main()
  51. {
  52.     int cases;
  53.     scanf("%d", &cases);
  54.     int caseno = 0;
  55.     while(cases--){
  56.         scanf("%d", &n);
  57.         m = n;
  58.         for(int i=1; i<=n; i++){
  59.             scanf("%d", &x[i]);
  60.         }
  61.         for(int i=1; i<=n; i++){
  62.             scanf("%d", &y[i]);
  63.         }
  64.         for(int i=1; i<=n; i++){
  65.             for(int j=1; j<=n; j++){
  66.                 if(x[i]>y[j]) a[i][j] = -2;
  67.                 else if(x[i] == y[j]) a[i][j] = -1;
  68.                 else a[i][j] = 0;
  69.             }
  70.         }
  71.         vector<int> ans = hungarain();
  72.         int tot = 0;
  73.         for(int i=1; i<=n; i++){
  74.             int col = ans[i];
  75.             tot += a[i][col]*-1;
  76.         }
  77.         printf("Case %d: %d\n", ++caseno, tot);
  78.     }
  79. }
Advertisement
Add Comment
Please, Sign In to add comment