int main() { int n, m; while(scanf("%d%d", &n, &m) == 2 && n) { g.init(n+m+2); for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) { double d; scanf("%lf", &d); g.AddEdge(j, m+i, 1, d); } for(int i = 1; i <= m; i++) g.AddEdge(0, i, 1, 0); for(int i = 1; i <= n; i++) g.AddEdge(m+i, m+n+1, 1, 0); double cost; int flow = g.MincostMaxflow(0, m+n+1, cost); printf("%.2lf\n", cost / n + 1e-8); } return 0; }
int main() { int n, a, b, v, kase = 0; while(scanf("%d%d%d", &n, &a, &b) == 3) { g.init(n+2); for(int u = 0; u < n; u++) { scanf("%d%d", &x[u], &y[u]); G[u].clear(); for(;;) { scanf("%d", &v); if(v == 0) break; G[u].push_back(v-1); } } memset(c1, 0, sizeof(c1)); memset(c2, 0, sizeof(c2)); double sum = 0; for(int u = 0; u < n; u++) { for(int i = 0; i < G[u].size(); i++) { int v = G[u][i]; double d = sqrt((x[u] - x[v])*(x[u] - x[v]) + (y[u] - y[v])*(y[u] - y[v])); double edge_cost = -d*a+b; // minimize sum{edge_cost} if(edge_cost >= 0) { g.AddEdge(u, v, 1, edge_cost); } else { g.AddEdge(v, u, 1, -edge_cost); c1[v]++; c2[u]++; sum += -edge_cost; } } } for(int u = 0; u < n; u++) { if(c1[u] > c2[u]) g.AddEdge(n, u, c1[u]-c2[u], 0); if(c2[u] > c1[u]) g.AddEdge(u, n+1, c2[u]-c1[u], 0); } double cost; int flow = g.MincostMaxflow(n, n+1, cost); double ans = sum - cost; if(ans < 0) ans = 0; // avoid -0.0 printf("Case %d: %.2lf\n", ++kase, ans); } return 0; }
int main() { int n, m, a, b, c; while(scanf("%d%d", &n, &m) == 2 && n) { g.init(n*2-2); // 点2~n-1拆成弧i->i',前者编号为0~n-1,后者编号为n~2n-3 for(int i = 2; i <= n-1; i++) g.AddEdge(i-1, i+n-2, 1, 0); while(m--) { scanf("%d%d%d", &a, &b, &c); // 连a'->b if(a != 1 && a != n) a += n-2; else a--; b--; g.AddEdge(a, b, 1, c); } int cost; g.MincostFlow(0, n-1, 2, cost); printf("%d\n", cost); } return 0; }
int main() { #ifdef _Rayn freopen("in.txt", "r", stdin); #endif int T, cases = 0; char buf[15]; scanf("%d", &T); while(T--) { scanf("%d%d%d", &n, &m, &k); Solver.Init(2*n*m+2); for(int i = 1; i <= n; ++i) { scanf("%s", buf + 1); for(int j = 1; j <= m; ++j) { grid[i][j] = buf[j] - '0'; } } int S = 0, T = 2*n*m+2; for(int i = 1; i <= n; ++i) { for(int j = 1; j <= m; ++j) { Solver.AddEdge(S, (i-1)*m+j, 1, 0); } } Solver.AddEdge(S, 2*n*m+1, k, 0); for(int i = 1; i <= n; ++i) { for(int j = 1; j <= m; ++j) { Solver.AddEdge((i-1)*m+j+n*m, T, 1, 0); Solver.AddEdge(2*n*m+1, (i-1)*m+j+n*m, 1, 0); } } for(int i = 1; i <= n; ++i) { for(int j = 1; j <= m; ++j) { for(int d = 0; d < 2; ++d) { int tx = i, ty = j; while(tx + dir[d][0] <= n && ty + dir[d][1] <= m) { tx += dir[d][0]; ty += dir[d][1]; int f = abs(tx-i) + abs(ty-j) - 1 - (grid[i][j] == grid[tx][ty]? grid[i][j] : 0); Solver.AddEdge((i-1)*m+j, (tx-1)*m+ty+n*m, 1, f); } } } } Solver.MinCost(S, T, flow, cost); printf("Case %d : ", ++cases); if(flow == n*m) printf("%d\n", -cost); else printf("-1\n"); } return 0; }