int main() { while (scanf("%d", &n) != EOF) { gg.init(n + 3); int supernode = n; int source = n + 1; int dest = source + 1; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf("%d", C[i] + j); if (i != j) { gg.add(i, j, 1, C[i][j]); } } } for (int i = 1; i < n; i++) { gg.add(i, supernode, 1, C[i][0]); gg.add(supernode, i - 1, 1, C[n - 1][i - 1]); } gg.add(source, 0, 1, 0); gg.add(n - 1, dest, 1, 0); printf("%d\n",gg.MF(source, dest)); } }
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() { freopen("contest.in", "r", stdin); freopen("contest.out", "w", stdout); scanf("%d %d %d %d %d", &n, &m, &rust, &t, &k); for (int i = 0; i < k; i++) { int u, v; scanf("%d %d", &u, &v); u--; v--; can[u].push_back(v); } int solved = get_maxflow(t / rust).EdmondKarp().second; int l = 0, r = solved; while (l < r) { int mid = (l + r) >> 1; if (get_maxflow(mid).EdmondKarp().second == solved) { r = mid; } else { l = mid + 1; } } long long penalty = 0; MCMF mcmf = get_maxflow(l); mcmf.EdmondKarp(); for (Edge it : mcmf.vEdge) { if (it.from <= n && n < it.to && it.flow == 1) { done[it.from]++; penalty += 1LL * done[it.from] * rust; } } memset(done, 0, sizeof(done)); printf("%d %lld\n", solved, penalty); for (Edge it : mcmf.vEdge) { //printf("debug %d %d %d\n", it.from, it.to, it.flow); if (it.from <= n && n < it.to && it.flow == 1) { printf("%d %d %d\n", it.from, it.to - n, done[it.from] * rust); done[it.from]++; } } 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() { int n, m; ios::sync_with_stdio(false); while(cin >> n >> m) { MCMF MF; if (n == 0 && m == 0) { break; } int S = n * m + 1; int T = S + 1; int tot = T + 1; MF.init(tot); for (int i = 0; i < n; i++) { cin >> grid[i]; for(int j = 0; j < m; j++) { if (grid[i][j] == 'm') { MF.add(S, i * m + j + 1, 1, 0); // cout <<"m "; } else if (grid[i][j] == 'H') { MF.add(i * m + j+1, T, 1, 0); // cout <<"eiwgo"; } for (int d = 0; d < 4; d++) { int tx = i + dx[d]; int ty = j + dy[d]; if (tx >= 0 && tx < n && ty >= 0 && ty < m) { MF.add(i * m + j+1, tx * m + ty+1, inf,1); //cout <<"addege"; } } } } cout << MF.mincost(S, T) << endl; } }
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() { #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; }