int main(){ int n; while(~scanf("%d", &n)){ KM g; g.gragh(n); printf("%d\n", g.km()); } return 0; }
int compute(int n, Edge *tree, int m, Edge *e) { static int g[maxV][maxV]; static int prev[maxV]; static int idx[maxV]; static bool vis[maxV]; static KM km; memset(g, -1, sizeof(g)); for (int i = 0; i < n - 1; i++) { int a = tree[i].a, b = tree[i].b, c = tree[i].c; g[a][b] = g[b][a] = i; } memset(km.E, 0, sizeof(km.E)); km.n = max(n - 1, m); queue<int> q; for (int j = 0; j < m; j++) { int a = e[j].a, b = e[j].b, c = e[j].c; memset(prev, -1, sizeof(prev)); memset(vis, 0, sizeof(vis)); while (!q.empty()) q.pop(); q.push(a); vis[a] = true; while (!q.empty()) { int u = q.front(); q.pop(); if (u == b) break; for (int v = 0; v < n; v++) { if (g[u][v] != -1 && !vis[v]) { vis[v] = true; prev[v] = u; idx[v] = g[u][v]; q.push(v); } } } for (int k = b; prev[k] != -1; k = prev[k]) { int i = idx[k]; int trc = tree[i].c; km.E[i][j] = trc - c; } } int val = km.solve(); for (int i = 0; i < n - 1; i++) { printf("%d\n", tree[i].c - km.lx[i]); } for (int i = 0; i < m; i++) { printf("%d\n", e[i].c + km.ly[i]); } }
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; }
int main() { // detect nuclear particle type ReadMatrix dataReader; string filename = "eigenFace"; string delimiter = ", "; MatrixXd data = dataReader.read(filename, delimiter); LINE; KM km; km.train(data); LINE; cout << "Clusters label of original data: " << endl<<endl; MatrixXd clusterLabel = km.clusterLabel(data); cout << clusterLabel.transpose() << endl << endl; LINE; }
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() { freopen("a", "r", stdin); scanf("%d", &T); while (T--) { scanf("%d%d", &N, &M); km.n = N; for (int i = 1; i <= M; i++) { int a, b, c; scanf("%d%d%d", &a, &b, &c); a--; b--; if (MAX - c > km.E[a][b]) km.E[a][b] = MAX - c; } printf("%d\n", km.solve()); } return 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; }