#include using namespace std; using LL = long long; const int INF = 0x3f3f3f3f; const int N = 405; int w[N][N]; int lx[N], ly[N]; int lmatch[N], rmatch[N]; bool lvis[N], rvis[N]; int slack[N]; int pre[N]; int n; int update(int n) { int dt = INF, ru; for (int j = 1; j <= n; j++) if (!rvis[j] && slack[j] < dt) { dt = slack[j]; ru = j; } for (int i = 1; i <= n; i++) { if (lvis[i]) lx[i] -= dt; if (rvis[i]) ly[i] += dt; else slack[i] -= dt; } return ru; } void match(int& u) { for (; u; swap(u, lmatch[pre[u]])) rmatch[u] = pre[u]; } void bfs(int u, int n) { queue q; q.push(u); lvis[u] = true; while (true) { while (!q.empty()) { int u = q.front(); q.pop(); for (int v = 1; v <= n; ++v) { int tmp; if (rvis[v] || (tmp = lx[u] + ly[v] - w[u][v]) > slack[v]) continue; pre[v] = u; if (!tmp) { if (!rmatch[v]) return match(v); rvis[v] = lvis[rmatch[v]] = true; q.push(rmatch[v]); } else slack[v] = tmp; } } u = update(n); if (!rmatch[u]) return match(u); rvis[u] = lvis[rmatch[u]] = true; q.push(rmatch[u]); } } LL KM(int n) { for (int i = 1; i <= n; i++) { lmatch[i] = rmatch[i] = lx[i] = ly[i] = 0; for (int j = 1; j <= n; j++) { lx[i] = max(lx[i], w[i][j]); } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { slack[j] = INF; lvis[j] = rvis[j] = false; } bfs(i, n); } LL res = 0; for (int i = 1; i <= n; i++) { res += lx[i] + ly[i]; } return res; } signed main() { // freopen("in", "r", stdin); int T_T, _ = 0; scanf("%d", &T_T); while(T_T--) { scanf("%d",&n); memset(w, 0, sizeof(w)); for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { scanf("%d", &w[i][j]); w[i][j] = -w[i][j]; } } printf("Case #%d: %I64d\n", ++_, -KM(n)); } return 0; }