稳定的婚姻问题幸福系数

问题描述 投票:1回答:1

我正在尝试为在线法官解决这个问题:

[有n位男性和n位女性。每个男人用从1n的数字来评估女性,给他们不同的等级,并且每个女人的评估与从1n的男人相似。所有这些都根据对两个伙伴的最大吸引力和幸福系数的计算原理形成对。幸福系数是男人对女人的评价之和。

您必须最大化对对的幸福系数之和并输出这些对。

输入:] >>

第一行包含自然的n,其中1  ≤  n ≤ 1000 –同性的人数。

接下来的n行包含男性对每个女性的评价。

用于女性的最后n行以类推输入。

[输出:

] >>

第一行应包含两对幸福系数的最大和。

第二行应依次包含男士的伴侣(首先是第一个人的伴侣,然后是第二个人的伴侣,依此类推。)

示例:

输入

3
1 2 3
2 3 1
1 2 3
1 2 3
2 3 1
3 1 2

输出

16
3 2 1

我有以下代码:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <climits>

using namespace std;

void stable_marriage(vector<vector<int>> &matrix) {
    int n = matrix[0].size(), happiness_sum = 0;
    vector<int> status(n * 2, -1);
    queue<int> Q;
    for (int i = 0; i < n; i++)
        Q.push(i);

    while (!Q.empty()) {
        int i = Q.front();
        Q.pop();
        for (int j = 0; j < n; j++) {
            if (status[matrix[i][j]] == -1) {
                status[i] = matrix[i][j];
                status[matrix[i][j]] = i;
                break;
            }
            else {
                int rank_1, rank_2;
                for (int k = 0; k < n; k++) {
                    if (matrix[matrix[i][j]][k] == status[matrix[i][j]])
                        rank_1 = k;
                    if (matrix[matrix[i][j]][k] == i)
                        rank_2 = k;
                }
                if (rank_2 < rank_1) {
                    status[i] = matrix[i][j];
                    int old = status[matrix[i][j]];
                    status[old] = -1;
                    Q.push(old);
                    status[matrix[i][j]] = i;
                    break;
                }
            }
        }
    }
    cout << happiness_sum << endl;
    for (int i = n - 1; i >= 0; i--) {
        cout << status[i] << ' ';
    }
}
int main() {

    //freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);

    int n;
    cin >> n;
    vector<vector<int>> matrix(n * 2, vector<int>(n));
    for (int i = 0; i < n * 2; i++) {
        for (int j = 0; j < n; j++) {
            cin >> matrix[i][j];
        }
    }

    stable_marriage(matrix);
    return 0;
}

现在,我不知道如何测量幸福系数?我不知道如何,您能帮忙吗?

[我正在尝试为在线法官解决这个问题:一共有n个男人和n个女人。每个男人用从1到n的数字来评估女人,给他们不同的等级,每个女人...

问题表明幸福感[[一对夫妇

是他们对各自伴侣的评价之和。您应该找到的价值是给定男女可以形成的n对夫妇的幸福总和的最大值。例如,对于示例输入,可以进行以下配对。

A = (1, 1), (2, 2), (3, 3) B = (1, 1), (2, 3), (3, 2) C = (1, 2), (2, 1), (3, 3) D = (1, 2), (2, 3), (3, 1) E = (1, 3), (2, 2), (3, 1) F = (1, 3), (2, 1), (3, 2)

您可以通过手动计算彼此的评估来确认,以下是可以针对每种情况获得的总和。

A = ( 2 + 6 + 5 ) = 13 B = ( 2 + 2 + 3 ) = 7 C = ( 4 + 4 + 5 ) = 13 D = ( 4 + 2 + 4 ) = 10 E = ( 6 + 6 + 4 ) = 16 F = ( 6 + 4 + 3 ) = 13

如您所见,如示例输出中所示,可以实现的最大总幸福感是16。
c++ algorithm graph-algorithm stable-marriage
1个回答
1
投票

问题表明幸福感[[一对夫妇

© www.soinside.com 2019 - 2024. All rights reserved.