예제 #1
0
파일: Source.cpp 프로젝트: lonelam/SolveSet
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));

	}
}
예제 #2
0
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;
}
예제 #3
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;
}
예제 #4
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;
}
예제 #5
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;
    }
}
예제 #6
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;
}
예제 #7
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;
}