#include using namespace std; #define y1 y114514 #define pb push_back #define mkp make_pair #define fi first #define se second #define all(a) a.begin(), a.end() typedef pair pii; typedef unsigned long long ull; typedef long long ll; const int M = 1000000007; const int NMAX = 211; const ll INF = ~0ull>>1; int Test, ca, n; int match[NMAX]; ll slack[NMAX]; int pre[NMAX]; ll label[2][NMAX]; ll weight[NMAX][NMAX]; bool visit[NMAX]; void augment(int root, int n){ int x, y, nxt, last; ll delta; memset(visit, 0, sizeof(visit)); fill(slack, slack + NMAX, INF); match[last = 0] = root; do{ visit[last] = true; x = match[last]; delta = INF; for(y = 1; y <= n; ++y){ if(visit[y]) continue; if(label[0][x] + label[1][y] - weight[x][y] < slack[y]){ slack[y] = label[0][x] + label[1][y] - weight[x][y]; pre[y] = last; } if(slack[y] < delta){ delta = slack[y]; nxt = y; } } for(y = 0; y <= n; ++y){ if(visit[y]){ label[0][match[y]] -= delta; label[1][y] += delta; }else slack[y] -= delta; } last = nxt; }while(match[last]); for(y = last; y; y = pre[y]) match[y] = match[pre[y]]; } ll KM(int n){ int i, j; ll delta, res = 0; memset(pre, 0, sizeof(pre)); for(i = 1; i <= n; ++i){ delta = 0; for(j = 1; j <= n; ++j) delta = max(delta, weight[i][j]); label[0][i] = delta; label[1][i] = 0; match[i] = 0; } for(i = 1; i <= n; ++i) augment(i, n); for(i = 1; i <= n; ++i){ res += label[0][i] + label[1][i]; //printf("i:%d %I64d %I64d\n", i, label[0][i], label[1][i]); } return res; } int main(){ scanf("%d", &Test); while(Test--){ scanf("%d", &n); for(int i = 1; i <= n; ++i) for(int j = 1; j <= n; ++j) scanf("%I64d", weight[i] + j), weight[i][j] = -weight[i][j]; printf("Case #%d: %I64d\n", ++ca, -KM(n)); } return 0; }