UVALive3989 Ladies' Choice —— 稳定婚姻问题 Gale - Shapely算法
2024-09-30 14:53:50
题目链接:https://vjudge.net/problem/UVALive-3989
题解:
题意:有n个男生和n个女生。每个女生对男神都有个好感度排行,同时每个男生对每个女生也有一个好感度排行。问:怎样配对,才能使的每个女生尽可能幸福。规定在配对的过程中,如果一对男女不是舞伴,且他们喜欢对方的程度都大于当前的舞伴,那么他么会“私奔”,留下他们的舞伴孤零零。由于是要每个女生尽可能幸福,所以女生根据喜欢程度,主动去男生。而男生只能处于被动的状态。
代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF = 2e9;
const LL LNF = 9e18;
const int mod = 1e9+;
const int MAXN = 1e3+; int pref[MAXN][MAXN], order[MAXN][MAXN], Next[MAXN];
int future_husband[MAXN], future_wife[MAXN];
queue<int>q; void engage(int woman, int man)
{
int w = future_wife[man];
if(w)
{
future_husband[w] = ;
q.push(w);
}
future_wife[man] = woman;
future_husband[woman] = man;
} int main()
{
int T, n;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
for(int i = ; i<=n; i++)
{
for(int j = ; j<=n; j++)
scanf("%d", &pref[i][j]);
Next[i] = ;
future_husband[i] = ;
q.push(i);
} for(int i = ; i<=n; i++)
{
for(int j = ; j<=n; j++)
{
int x;
scanf("%d", &x);
order[i][x] = j;
}
future_wife[i] = ;
} while(!q.empty())
{
int woman = q.front(); q.pop();
int man = pref[woman][Next[woman]++];
if(!future_wife[man])
engage(woman, man);
else if(order[man][woman]<order[man][future_wife[man]])
engage(woman, man);
else q.push(woman);
}
while(!q.empty()) q.pop(); for(int i = ; i<=n; i++)
printf("%d\n", future_husband[i]);
if(T) printf("\n");
}
}
最新文章
- Unity贴图锯齿
- Web API应用架构在Winform混合框架中的应用(1)
- CodeForces 37E Trial for Chief
- 【Git】标签管理
- Android开发在路上:少去踩坑,多走捷径
- CSS元素类型
- wpa_supplicant 和 802.11g WPA 认证的配置
- oracle根据pid查询出正在执行的执行语句
- phonegap 4.2 环境搭建 及 项目创建 运行
- Android各代码层获取系统时间的方法
- Java中间件:淘宝网系统高性能利器(转)
- 第二章:2.9 总结一下 Django
- 【Unity游戏开发】浅谈Unity游戏开发中的单元测试
- 排序算法Java实现(直接插入排序)
- html5中新增的元素和废除的元素
- 7.docker日志收集
- Numpy 数组属性
- .NET开源项目 QuarkDoc 一款自带极简主义属性的文档管理系统
- Spark RDD Transformation 简单用例(二)
- 2.虚拟机安装的ubuntu全屏显示