コード例 #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;
}