Esempio n. 1
0
int main(){
  int n, w;
  while(scanf("%d", &n) == 1) {
    solver.init(n);
    for(int i = 0; i < n; i++)
      for(int j = 0; j < n; j++) {
        scanf("%d", &w);
        solver.AddEdge(i, j, w);
      }
    solver.solve();
    int sum = 0;
    for(int i = 0; i < n-1; i++) { printf("%d ", solver.Lx[i]); sum += solver.Lx[i]; } printf("%d\n", solver.Lx[n-1]);
    for(int i = 0; i < n-1; i++) { printf("%d ", solver.Ly[i]); sum += solver.Ly[i]; } printf("%d\n", solver.Ly[n-1]);
    printf("%d\n", sum + solver.Lx[n-1] + solver.Ly[n-1]);
  }
  return 0;
}
Esempio n. 2
0
int main(){
  int kase = 0;
  while(scanf("%d%d", &m, &n) == 2 && m && n) {
    solver.init(m*n);
    int size[maxr];
    for(int region = 0; region < m; region++) scanf("%d", &size[region]);
    for(int program = 0; program < n; program++) {
      int s[10], t[10], k;
      scanf("%d", &k);
      for(int i = 0; i < k; i++) scanf("%d%d", &s[i], &t[i]);

      for(int region = 0; region < m; region++) {
        // 计算程序p在内存区域r中的运行时间
        int& time = runtime[program][region];
        time = INF;
        if(size[region] < s[0]) continue;
        for(int i = 0; i < k; i++)
          if(i == k-1 || size[region] < s[i+1]) {
            time = t[i];
            break;
          }

        // 连边X(program) -> Y(region,pos)
        for(int pos = 0; pos < n; pos++)
          solver.AddEdge(program, region * n + pos, -(pos + 1) * time); // 本题要求最小值,权值要取相反数
      }
    }

    // 补完其他边
    for(int i = n; i < n*m; i++)
      for(int j = 0; j < n*m; j++)
        solver.AddEdge(i, j, 1);

    solver.solve();

    printf("Case %d\n", ++kase);
    print_solution();
  }
  return 0;
}
Esempio n. 3
0
int main()
{
	freopen("a", "r", stdin);
	while (scanf("%d%d%d", &N, &M, &K) != EOF)
	{
		if (N == 0 && M == 0 && K == 0) break;
		for (int i = 0; i < N; i++)
			for (int j = 0; j < K; j++)
			{
				scanf("%d", &need[i][j]);
				//printf("%dneed\n", need[i][j]);
			}
		for (int i = 0; i < M; i++)
			for (int j = 0; j < K; j++)
			{
				scanf("%d", &have[i][j]);
				//printf("%dhave\n", have[i][j]);
			}
		for (int k = 0; k < K; k++)
			for (int i = 0; i < N; i++)
				for (int j = 0; j < M; j++)
				{
					scanf("%d", &cost[k][i][j]);
					//printf("%dcost\n", cost[k][i][j]);
				}

		bool ok = true;
		for (int i = 0; i < K; i++)
		{
			int allNeed = 0, allHave = 0;
			for (int j = 0; j < N; j++)
				allNeed += need[j][i];
			for (int j = 0; j < M; j++)
				allHave += have[j][i];
			if (allNeed > allHave)
			{
				ok = false;
				printf("-1\n");
				break;
			}
		}
		if (!ok) continue;
		int ans = 0;
		for (int k = 0; k < K; k++)
		{
			int X = 0, Y = 0;
			for (int i = 0; i < N; i++)
				for (int j = 1; j <= need[i][k]; j++)
					A[X++] = i;
			for (int i = 0; i < M; i++)
				for (int j = 1; j <= have[i][k]; j++)
					B[Y++] = i;
			km.init(X, Y);
			for (int i = 0; i < X; i++)
				for (int j = 0; j < Y; j++)
				{
					km.addEdge(i, j, -cost[k][A[i]][B[j]]);
					//cout << i << " " << j << cost[k][A[i]][B[j]] << endl;
				}
			ans += -km.solve();
		}
		printf("%d\n", ans);
	}
	return 0;
}