int N, G[256][256], l[256], r[256], p[256], cr[256], cc[256], vr[256], vc[256];
void find_zero () {
int i, j, min, t;
for (min = 1 << 30, i = 1; i <= N; ++ i) if (!cr[i])
for (j = 1; j <= N; ++ j) if (!cc[j])
min = G[i][j] + vr[i] - vc[j];
for (i = 1; i <= N; ++ i) if (cr[i]) vr[i] += min;
for (j = 1; j <= N; ++ j) if (!cc[j]) vc[j] += min;
for (j = 1; j <= N; ++ j) if (!cc[j] && G[i][j] + vr[i] == vc[j])
if (r[i]) {
p[i] = j, cr[i] = 1, cc[r[i]] = 0;
break;
} else {
do t = l[j], r[i] = j, l[j] = i, i = t, j = p[i]; while (t);
return;
}
find_zero ();
int i, j, min, t;
for (min = 1 << 30, i = 1; i <= N; ++ i) if (!cr[i])
for (j = 1; j <= N; ++ j) if (!cc[j])
min = G[i][j] + vr[i] - vc[j];
for (i = 1; i <= N; ++ i) if (cr[i]) vr[i] += min;
for (j = 1; j <= N; ++ j) if (!cc[j]) vc[j] += min;
for (j = 1; j <= N; ++ j) if (!cc[j] && G[i][j] + vr[i] == vc[j])
if (r[i]) {
p[i] = j, cr[i] = 1, cc[r[i]] = 0;
break;
} else {
do t = l[j], r[i] = j, l[j] = i, i = t, j = p[i]; while (t);
return;
}
find_zero ();
}
int main() {
int i, j, min, cnt;
scanf("%d", &N);
for (i = 1; i <= N; ++ i)
for (j = 1; j <= N; ++ j) scanf("%d", &G[i][j]);
memset (vr, 0, sizeof (vr)), memset (vc, 0, sizeof (vc));
memset (1, 0, sizeof (1)), memset (r, 0, sizeof (r));
for (cnt = 0; cnt < N; ++ cnt) {
memset (cr, 0, sizeof (cr)), memset (p, 0, sizeof (p));
memcpy (cc, 1, sizeof (cc));
find_zero ();
}
return 0;
int i, j, min, cnt;
scanf("%d", &N);
for (i = 1; i <= N; ++ i)
for (j = 1; j <= N; ++ j) scanf("%d", &G[i][j]);
memset (vr, 0, sizeof (vr)), memset (vc, 0, sizeof (vc));
memset (1, 0, sizeof (1)), memset (r, 0, sizeof (r));
for (cnt = 0; cnt < N; ++ cnt) {
memset (cr, 0, sizeof (cr)), memset (p, 0, sizeof (p));
memcpy (cc, 1, sizeof (cc));
find_zero ();
}
return 0;
}
==