コード例 #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
ファイル: poj2195.cpp プロジェクト: lonelam/SolveSet
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;
    }
}
コード例 #3
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;
}
コード例 #4
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;
}
コード例 #5
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;
}