LightOJ - 1400 Employment(婚姻稳定问题)
来源:互联网 发布:手机免费注册淘宝店铺 编辑:程序博客网 时间:2024/05/21 00:18
题目大意:在一个party上,有N个男的,N个女的,要求你将其配对,使其满足
1.男生u和女生v还没配对
2.他们喜欢对方的程度都大于喜欢各自当前舞伴的程度
如果出现了2的情况,他们就会抛下当前的舞伴,另外组成一对
解题思路:这题的话,就是婚姻稳定问题,他的解决方法是,男士不断的求婚,而女士不断的拒绝,直到男生找到合适的女生
#include <cstdio>#include <cstring>#include <queue>using namespace std;const int N = 210;int n, cas = 1;//No[i][j]表示j在i心中的排名//pre[i][j]表示第i个人心中,第j的排名是谁int Next[N], No[N][N], pre[N][N];int future_husband[N], future_wife[N];void init() { scanf("%d", &n); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { scanf("%d", &pre[i][j]); No[i][pre[i][j]] = j; } Next[i] = 1; } for (int i = n + 1; i <= 2 * n; i++) for (int j = 1; j <= n; j++) { scanf("%d", &pre[i][j]); No[i][pre[i][j]] = j; }}void solve() { memset(future_husband, 0, sizeof(future_husband)); memset(future_wife, 0, sizeof(future_wife)); queue<int> Q; //男生发出请求 for (int i = 1; i <= n; i++) Q.push(i); while (!Q.empty()) { int u = Q.front(); Q.pop(); int v = pre[u][Next[u]++]; //如果女生没有舞伴 if (!future_husband[v]) { future_husband[v] = u; future_wife[u] = v; }//如果女生有舞伴,但符合第二种情况 else if (No[v][future_husband[v]] > No[v][u]) { Q.push(future_husband[v]); future_husband[v] = u; future_wife[u] = v; }//被拒绝了 else Q.push(u); } printf("Case %d:", cas++); for (int i = 1; i <= n; i++) printf(" (%d %d)", i, future_wife[i]); printf("\n");}int main() { int test; scanf("%d", &test); while (test--) { init(); solve(); } return 0;}
0 0
- LightOJ 1400 - Employment【稳定婚姻问题】
- LightOJ - 1400 Employment(婚姻稳定问题)
- 稳定婚姻问题
- 稳定婚姻问题算法
- 稳定婚姻问题
- poj3487 稳定婚姻问题
- 关于稳定婚姻问题
- 【稳定婚姻问题】
- 稳定婚姻问题
- 稳定婚姻问题
- 稳定婚姻问题
- 稳定婚姻问题算法
- 稳定婚姻问题
- 稳定婚姻问题
- 稳定婚姻问题
- hdu1914 稳定婚姻问题
- hdu1435 稳定婚姻问题
- 稳定婚姻问题
- OC三大特性之一:多态的介绍
- 1027 打印沙漏
- leetcode-Ugly Number
- PhpStorm中的Git设置
- ecshop 会员登录注册业务逻辑实现
- LightOJ - 1400 Employment(婚姻稳定问题)
- iOS与内存管理
- 1028 人口普查
- struts2 ognl表达式
- OC第八天 属性 点语法 KVC
- poj Power Network 1459 (多汇点多源点问题)
- 如何在很多的.o文件中查找到需要的函数,从而定位到源文件?
- Xcode文件后标记
- 1029 旧键盘