我正在尝试为在线法官解决此问题:
有一套n
男性和n
女性。每个男人用从1
到n
的数字来评估女性,给他们不同的等级,每个女人对男人的评估从1
到n
相似。所有这一切都导致根据对两个伙伴的最大吸引力和幸福系数的计算原理形成配对。幸福系数是男人对女人的评价之和。
您必须最大化对对的幸福系数之和并输出这些对。
输入:
第一行包含一个自然的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>
using namespace std;
void stable_marriage(vector<vector<int>> &matrix) {
int n = matrix[0].size();
vector<int> status(n * 2, -1);/*status[i] contains husband/wife of i, initially -1*/
queue<int> q;
for (int i = 0; i < n; i++)/* Push all single men */
q.push(i);
/* While there is a single men */
while (!q.empty()) {
int i = q.front();
q.pop();
/* iterate through his preference list */
for (int j = 0; j < n; j++) {
/* if girl is single marry her to this man*/
if (status[matrix[i][j]] == -1) {
status[i] = matrix[i][j];/* set this girl as wife of i */
status[matrix[i][j]] = i;/*make i as husband of this girl*/
break;
}
else {
int rank_1, rank_2;/* for holding priority of current husband and most preferable husband*/
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 current husband is less attractive
than divorce him and marry a new one making the old one
single */
if (rank_2 < rank_1) {/* if this girl j prefers current man i
more than her present husband */
status[i] = matrix[i][j];/* her wife of i */
int old = status[matrix[i][j]];
status[old] = -1;/*divorce current husband*/
q.push(old);/*add him to list of singles */
status[matrix[i][j]] = i;/* set new husband for this girl*/
break;
}
}
}
}
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;
}
现在,我没有得到的是如何测量幸福系数?我不知道如何,您能帮忙吗?
最佳答案
问题指出,夫妻的幸福感是他们对各自伴侣的评价之和。您应该找到的值(value)是可以由给定的男人和女人形成的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++ - 稳定的婚姻问题幸福系数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61938820/