Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <iostream>
- #include <cstdlib>
- #include <cstring>
- #include <cmath>
- #include <algorithm>
- #include <vector>
- #include <queue>
- #include <set>
- #include <map>
- #include <string>
- #include <cassert>
- using namespace std;
- const int MAXN = 105;
- int co[MAXN ][MAXN ];
- int c[MAXN ][MAXN ];
- int n;
- int sta, fin;
- int d[MAXN];
- int p[MAXN];
- int inf = 1000000000;
- bool deik() {
- memset(p, 0, sizeof(p));
- int N = fin + 1;
- for (int i = 0; i < N; i++)
- d[i] = inf;
- d[sta] = 0;
- for (int i =0; i < N; i++) {
- for (int v = 0; v < N; v++) {
- for (int to = 0; to < N; to++) {
- if (c[v][to] > 0 && d[v] < inf && d[to] > d[v] + co[v][to]) {
- d[to] = d[v] + co[v][to];
- p[to] = v;
- }
- }
- }
- }
- return d[fin] < inf;
- }
- int getFlow() {
- int ans = 0;
- while(deik()) {
- ans += d[fin];
- int v = fin;
- while(v != sta) {
- //printf("%d %d\n", p[v], v);
- c[p[v]][v] --, c[v][p[v]] ++;
- v = p[v];
- }
- }
- return ans;
- }
- int add[MAXN][MAXN];
- int ans[MAXN][3];
- int ans2[MAXN][3];
- int main() {
- int tt = 0;
- while(true) {
- tt ++;
- //memset(co, 0, sizeof(co));
- //memset(c, 0, sizeof(c));
- //memset(add, 0, sizeof(add));
- cin >> n;
- if (n == 0)
- return 0;
- sta = n * 2, fin = sta + 1;
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- scanf("%d", &co[i][n + j]);
- co[n + j][i] = - co[i][n + j];
- c[i][n + j] = 1;
- c[n + j][i] = 0;
- add[i][n + j] = 0;
- }
- c[sta][i] = c[n + i][fin] = 1;
- c[i][sta] = c[fin][n + i] = 0;
- }
- getFlow();
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- if (!c[i][n + j]) {
- for (int k = 0; k < n; k++) {
- add[i][n + k] = max(add[i][n + k], co[i][n + j]);
- add[k][n + j] = max(add[k][n + j], co[i][n + j]);
- }
- ans[i][0] = co[i][n + j];
- ans2[i][0] = j + 1;
- }
- }
- }
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- scanf("%d", &co[i][n + j]), co[i][n + j] += add[i][n + j], co[n + j][i] = -co[i][n + j];
- c[i][n + j] = 1;
- c[n + j][i] = 0;
- }
- c[sta][i] = c[n + i][fin] = 1;
- c[i][sta] = c[fin][n + i] = 0;
- }
- getFlow();
- int tot = 0;
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- if (!c[i][n + j]) {
- ans[i][1] = co[i][n + j] - add[i][n + j];
- ans[i][2] = co[i][n + j];
- ans2[i][1] = j + 1;
- ans2[i][2] = co[i][n + j];
- tot += ans[i][2] - ans[i][0] - ans[i][1];
- }
- }
- }
- printf("Case %d:\n", tt);
- for (int i = 0; i < n; i++) {
- printf("Worker %d: ", i + 1);
- for (int j = 0; j < 3; j++)
- printf("%d ", ans2[i][j]);
- printf("\n");
- }
- printf("Total idle time: %d\n", tot);
- }
- return 0;
- }
- /*
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement