Esempio n. 1
0
int main(){
	int n;
	while(~scanf("%d", &n)){
		KM g; g.gragh(n);
		printf("%d\n", g.km());
	}
	return 0;
}
Esempio n. 2
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]);
	}
}
Esempio n. 3
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;
}
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;  
}
Esempio n. 5
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. 6
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;
}
Esempio n. 7
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;
}