以下是一个简单的C语言程序,用于解决稳定婚配问题:
#include <stdio.h>
#include <string.h>
#define MAX 100
// 存储人员信息的结构体
struct person {
char name[MAX];
int rank[MAX];
int partner;
int engaged;
};
// 判断该人是否在候选名单中
int in_list(int list[], int len, int val) {
int i;
for (i = 0; i < len; i++) {
if (list[i] == val) {
return 1;
}
}
return 0;
}
// 稳定婚配算法
void stable_marriage(struct person men[], struct person women[], int n) {
int i, j, k;
int num_engaged = 0;
int men_list[MAX];
int women_list[MAX];
int free_men[MAX];
int num_free_men = n;
memset(men_list, -1, sizeof(men_list));
memset(women_list, -1, sizeof(women_list));
memset(free_men, 0, sizeof(free_men));
// 所有男士都是自由的
for (i = 0; i < n; i++) {
free_men[i] = 1;
}
while (num_engaged < n) {
// 随机选择一个自由的男士
for (i = 0; i < n; i++) {
if (free_men[i]) {
break;
}
}
j = i;
// 为该男士选择最喜欢的女士
for (i = 0; i < n && free_men[j]; i++) {
k = men[j].rank[i];
if (women[k].partner == -1) {
men_list[j] = k;
women_list[k] = j;
men[j].partner = k;
women[k].partner = j;
men[j].engaged = 1;
free_men[j] = 0;
num_engaged++;
}
else {
if (in_list(women[k].rank, n, j)) {
// 如果该女士已经有伴侣,但她更喜欢当前男士
int old_partner = women[k].partner;
men_list[old_partner] = -1;
women_list[k] = j;
men[j].partner = k;
women[k].partner = j;
men[j].engaged = 1;
free_men[j] = 0;
free_men[old_partner] = 1;
}
}
}
}
// 输出结果
printf("稳定婚配结果:\n");
for (i = 0; i < n; i++) {
printf("%s - %s\n", men[i].name, women[men[i].partner].name);
}
}
int main() {
struct person men[MAX];
struct person women[MAX];
int n, i, j;
printf("请输入人数:");
scanf("%d", &n);
printf("请输入男士姓名和他们对女士的喜好排名(从最喜欢到最不喜欢):\n");
for (i = 0; i < n; i++) {
printf("男士%d:", i + 1);
scanf("%s", men[i].name);
for (j = 0; j < n; j++) {
scanf("%d", &men[i].rank[j]);
men[i].rank[j]--; // 将喜好排名转换为索引
}
men[i].partner = -1;
men[i].engaged = 0;
}
printf("请输入女士姓名和他们对男士的喜好排名(从最喜欢到最不喜欢):\n");
for (i = 0; i < n; i++) {
printf("女士%d:", i + 1);
scanf("%s", women[i].name);
for (j = 0; j < n; j++) {
scanf("%d", &women[i].rank[j]);
women[i].rank[j]--; // 将喜好排名转换为索引
}
women[i].partner = -1;
}
stable_marriage(men, women, n);
return 0;
}