Advertisement
Guest User

Untitled

a guest
Oct 21st, 2016
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.50 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <vector>
  8. #include <queue>
  9. #include <set>
  10. #include <map>
  11. #include <string>
  12. #include <cassert>
  13. using namespace std;
  14.  
  15. const int MAXN = 105;
  16.  
  17. int co[MAXN ][MAXN ];
  18. int c[MAXN ][MAXN ];
  19. int n;
  20. int sta, fin;
  21.  
  22. int d[MAXN];
  23. int p[MAXN];
  24. int inf = 1000000000;
  25.  
  26. bool deik() {
  27.     memset(p, 0, sizeof(p));
  28.     int N = fin + 1;
  29.     for (int i = 0; i < N; i++)
  30.         d[i] = inf;
  31.     d[sta] = 0;
  32.     for (int i =0; i < N; i++) {
  33.         for (int v = 0; v < N; v++) {
  34.             for (int to = 0; to < N; to++) {
  35.                 if (c[v][to] > 0 && d[v] < inf && d[to] > d[v] + co[v][to]) {
  36.                     d[to] = d[v] + co[v][to];
  37.                     p[to] = v;
  38.                 }
  39.             }
  40.         }
  41.     }
  42.     return d[fin] < inf;
  43. }
  44.  
  45. int getFlow() {
  46.     int ans = 0;
  47.     while(deik()) {
  48.         ans += d[fin];
  49.         int v = fin;
  50.         while(v != sta) {
  51.             //printf("%d %d\n", p[v], v);
  52.             c[p[v]][v] --, c[v][p[v]] ++;
  53.             v = p[v];
  54.         }
  55.     }
  56.     return ans;
  57. }
  58. int add[MAXN][MAXN];
  59. int ans[MAXN][3];
  60. int ans2[MAXN][3];
  61.  
  62. int main() {
  63.     int tt = 0;
  64.     while(true) {
  65.         tt ++;
  66.         //memset(co, 0, sizeof(co));
  67.         //memset(c, 0, sizeof(c));
  68.         //memset(add, 0, sizeof(add));
  69.         cin >> n;
  70.         if (n == 0)
  71.             return 0;
  72.         sta = n * 2, fin = sta + 1;
  73.         for (int i = 0; i < n; i++) {
  74.             for (int j = 0; j < n; j++) {
  75.                 scanf("%d", &co[i][n + j]);
  76.                 co[n + j][i] = - co[i][n + j];
  77.                 c[i][n + j] = 1;
  78.                 c[n + j][i] = 0;
  79.                 add[i][n + j] = 0;
  80.             }
  81.             c[sta][i] = c[n + i][fin] = 1;
  82.             c[i][sta] = c[fin][n + i] = 0;
  83.         }
  84.         getFlow();
  85.         for (int i = 0; i < n; i++) {
  86.             for (int j = 0; j < n; j++) {
  87.                 if (!c[i][n + j]) {
  88.                     for (int k = 0; k < n; k++) {
  89.                         add[i][n + k] = max(add[i][n + k], co[i][n + j]);
  90.                         add[k][n + j] = max(add[k][n + j], co[i][n + j]);
  91.                     }
  92.                     ans[i][0] = co[i][n + j];
  93.                     ans2[i][0] = j + 1;
  94.                 }
  95.             }
  96.         }
  97.         for (int i = 0; i < n; i++) {
  98.             for (int j = 0; j < n; j++) {
  99.                 scanf("%d", &co[i][n + j]), co[i][n + j] += add[i][n + j], co[n + j][i] = -co[i][n + j];
  100.                 c[i][n + j] = 1;
  101.                 c[n + j][i] = 0;
  102.             }
  103.             c[sta][i] = c[n + i][fin] = 1;
  104.             c[i][sta] = c[fin][n + i] = 0;
  105.         }
  106.         getFlow();
  107.         int tot = 0;
  108.         for (int i = 0; i < n; i++) {
  109.             for (int j = 0; j < n; j++) {
  110.                 if (!c[i][n + j]) {
  111.                     ans[i][1] = co[i][n + j] - add[i][n + j];
  112.                     ans[i][2] = co[i][n + j];
  113.                     ans2[i][1] = j + 1;
  114.                     ans2[i][2] = co[i][n + j];
  115.                     tot += ans[i][2] - ans[i][0] - ans[i][1];
  116.                 }
  117.             }
  118.         }
  119.         printf("Case %d:\n", tt);
  120.         for (int i = 0; i < n; i++) {
  121.             printf("Worker %d: ", i + 1);
  122.             for (int j = 0; j < 3; j++)
  123.                 printf("%d ", ans2[i][j]);
  124.             printf("\n");
  125.         }
  126.         printf("Total idle time: %d\n", tot);
  127.     }
  128.    
  129.    
  130.    
  131.     return 0;
  132. }
  133.  
  134. /*
  135.  */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement