两题都是基础题,不同的是 zoj 那题的男女可能重名。

Gale-Shapley 算法:

while ( 存在男人m是自由的 ) {

    令w是m的还没求过婚的最高排名的女人

    if ( w是自由的 )  m-w 配对

    else  {

        取 w 的当前对象 m1

        if ( w 更爱 m1 )   m保持自由

        else  m-w 配对  m1变成自由

    }

}

poj 3487

const int N = 105;int n;
int hm[N], hw[N];   //hm[i]为第i个男人的配偶   -1表示自由
int a[N][N], b[N][N], p[N]; //a[i][0~n]表示第i个男人心中的女人排名//b[i][0~n]表示第i个女人心中的男人排名
string man[N], woman[N];//姓名
map<string, int> mp;    //姓名->序号
set<int> st;    //自由男人的集合void read(){mp.clear(); st.clear();memset(hm, -1, sizeof hm);memset(hw, -1, sizeof hw);memset(p, 0, sizeof p);cin>>n;FOR(i, 0, n){ cin>>man[i]; mp[ man[i] ] = i; }FOR(i, 0, n){ cin>>woman[i]; mp[ woman[i] ] = i; }string str, s="";int t;FOR(i, 0, n){cin>>str; s = str[0]; t = mp[s];FOR(j, 2, n+2){ s = str[j]; a[t][j-2] = mp[s]; }}FOR(i, 0, n){cin>>str; s = str[0]; t = mp[s];FOR(j, 2, n+2){ s = str[j]; b[t][j-2] = mp[s]; }}
}void solve(){FOR(i, 0, n) {st.insert(i); }   //开始所有男人都是自由的while( !st.empty() ){   //还有自由男人int m = *st.begin(); st.erase(m);   //任取一个while(1){int w = a[m][ p[m]++ ]; //未拒绝此男人的最优女人int m1= hw[w], t;   //此女人的配偶if(m1==-1){ hw[w]=m; hm[m]=w;  break; } //女人自由FOR(i, 0, n) if(b[w][i]==m1 || b[w][i]==m) {t=b[w][i]; break;}  //t是较优的男人if(t==m){   //m更优  重新组合hw[w]=m; hm[m]=w;  hm[m1]=-1;st.insert(m1); break;}}}
}int main(){#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);#endifint T;cin>>T;while(T--){read();solve();FOR(i, 0, n) cout<<man[i]<<' '<<woman[ hm[i] ]<<endl;cout<<endl;}return 0;
}

zoj 1576

const int N = 505;int n;
int hm[N], hw[N];   //hm[i]为第i个男人的配偶   -1表示自由
int a[N][N], b[N][N], p[N]; //a[i][0~n] 男i心中的女人次序//b[i][0~n] 女i心中的男人次序
int c[N][N];    //c[i][j] 女i心中,男j的排名
string man[N], woman[N];//姓名
map<string, int> mp,wp;    //姓名->序号
set<int> st;    //自由男人的集合void read(){mp.clear(); wp.clear(); st.clear();memset(hm, -1, sizeof hm);memset(hw, -1, sizeof hw);memset(p, 0, sizeof p);string str;FOR(i, 0, n){cin>>man[i]; mp[ man[i] ] = i;if(i == 0)FOR(j, 0, n){cin>>woman[j]; wp[ woman[j] ] = j;a[i][j] = j;}elseFOR(j, 0, n){cin>>str;a[i][j] = wp[str];}}FOR(i, 0, n){cin>>str; int t = wp[str];FOR(j, 0, n){cin>>str;int v = mp[str];b[t][j] = v;c[t][v] = j;}}
}void solve(){FOR(i, 0, n) {st.insert(i); }   //开始所有男人都是自由的while( !st.empty() ){int m = *st.begin(); st.erase(m);while(1){int w = a[m][ p[m]++ ]; //未拒绝此男人的最优女人int m1 = hw[w];   //此女人的配偶if( m1 == -1 ){ hw[w]=m; hm[m]=w;  break; } //女人无配偶if(c[w][m] < c[w][m1]){   //女人有配偶但m更优hw[w] = m; hm[m] = w;  hm[m1] = -1;st.insert(m1); break;}}}
}int main(){#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);#endifwhile(cin>>n){read();solve();FOR(i, 0, n) cout<<man[i]<<' '<<woman[ hm[i] ]<<endl;cout<<endl;}return 0;
}

转载于:https://www.cnblogs.com/ts65213/archive/2013/05/16/3082329.html

poj 3487 zoj 1576 稳定婚姻相关推荐

  1. 【BZOJ2140】稳定婚姻 Tarjan

    [BZOJ2140]稳定婚姻 Description 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. ...

  2. hdu1435 稳定婚姻问题

    题意: Stable Match Special Judge Problem Description Network 公司的BOSS 说现在他们公司建立的信号发射站和接收站经常出现信号发送接收不稳定的 ...

  3. hdu1914 稳定婚姻问题

               稳定婚姻问题就是给你n个男的,n个女的,然后给你每个男生中女生的排名,和女生心目中男生的排名,然后让你匹配成n对,使婚姻稳定,假如a和b匹配,c和d匹配,如果a认为d比b好,同时 ...

  4. 稳定婚姻问题(自己的总结)

         稳定婚姻问题就是给你n个男的,n个女的,然后给你每个男生中女生的排名,和女生心目中男生的排名,然后让你匹配成n对,使婚姻稳定,假如a和b匹配,c和d匹配,如果a认为d比b好,同时d也认为a比 ...

  5. 稳定匹配问题——稳定婚姻算法设计

    图片源自:美剧<How I met your mother> **** 本代码带有详细的注释,并在控制台输出时详细地说明了算法的过程,非常有助于新手理解稳定匹配问题和稳定婚姻算法的设计思路 ...

  6. 稳定婚姻问题:Gale–Shapley算法

    (一)问题的引出 在组合数学.经济学.计算机科学中,稳定婚姻问题(英语:stable marriage problem,简称SMP)又称为稳定配对问题(stable matching problem) ...

  7. 【文末福利】图论算法:稳定婚姻问题,如何找到最适合自己的另一半

    什么是算法? >>>> 每当有人问我这样的问题,我总会引用下面这个例子. 假如你是一个媒人,有若干名单身男子登门求助,还有同样多的单身 女子也来征婚.如果你已经知道这些女孩儿在 ...

  8. 图论 —— 稳定婚姻问题与延迟认可算法

    [稳定婚姻问题] 1.集合 M 表示 n 个男性 2.集合 F 表示 n 个女性 3.对于每个人我们都按异性的中意程度给出一份名单(从最中意的到最不中意的) 如果没有 ,f 对 m 比对她的配偶中意的 ...

  9. LA 3989 - Ladies' Choice 稳定婚姻问题

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

最新文章

  1. C#PDF转Image
  2. 杂项-权限管理:RBAC
  3. 解方程 2014NOIP提高组 (数学)
  4. 数据流图软件_软件工程导论知识点梳理之概念题
  5. #ifdef __cplusplus是什么意思
  6. 03-03 APP 控件定位
  7. XP的常见蓝屏代码和解决方案
  8. java day35【Bootstrap】
  9. docker 部署 nacos2.x 镜像
  10. ds6708 symbol 驱动_symbol DS6708设置及使用手册中文版.pdf
  11. c语言编写转动惯量的数据处理函数,【物理实验】C语言处理刚体惯量数据,上物理实验的戳进.省90......
  12. spring框架学习(一)
  13. 条件欧几里得聚类实验数据集Statues_4.pcd下载
  14. 电脑excel合并单元格怎么拆分开来
  15. 2021-09-19
  16. Teacher Forcing for Recurrent Neural Networks
  17. 单片机同一按键实现长按开关机,短按换挡,并带有记忆功能
  18. 【STM32F429的DSP教程】第3章 Matlab简易使用之基础操作
  19. 06 - 微信公众号的菜单配置
  20. 趣店探探等30款APP违规收集个人信息被通报

热门文章

  1. PHP性能如何实现全面优化?
  2. 关于linux LVM
  3. SQL2008如何创建定时任务作业
  4. PASSWORD,ENABLE,CONSOLE,VTY及TACACS认证顺序及区别
  5. 优化SQL Server的内存占用之执行缓存
  6. win7系统电脑自动重启解决方法
  7. Android 可视化界面编辑器无法显示界面问题的终极解决方案
  8. ActiveServices
  9. vue基础知识(一)
  10. 公司app 从兼容Android 8.0 升级兼容9.0