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; 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, 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; }