コード例 #1
0
ファイル: UVa10746.cpp プロジェクト: Chin-Z/aoapc-book
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;
}
コード例 #2
0
ファイル: UVa1659.cpp プロジェクト: 1305631481/aoapc-bac2nd
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;
}
コード例 #3
0
ファイル: UVa1658.cpp プロジェクト: 1305631481/aoapc-bac2nd
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;
}
コード例 #4
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;
}