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; }
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; }