日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

poj 3487 zoj 1576 稳定婚姻

發(fā)布時(shí)間:2024/4/14 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj 3487 zoj 1576 稳定婚姻 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

兩題都是基礎(chǔ)題,不同的是 zoj 那題的男女可能重名。

Gale-Shapley 算法:

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

    令w是m的還沒求過婚的最高排名的女人

    if ( w是自由的 ) ?m-w 配對(duì)

    else ?{

        取 w 的當(dāng)前對(duì)象 m1

        if ( w 更愛 m1 ) ? m保持自由

        else ?m-w?配對(duì) ?m1變成自由

    }

}

?

?poj 3487

const int N = 105;int n; int hm[N], hw[N]; //hm[i]為第i個(gè)男人的配偶 -1表示自由 int a[N][N], b[N][N], p[N]; //a[i][0~n]表示第i個(gè)男人心中的女人排名//b[i][0~n]表示第i個(gè)女人心中的男人排名 string man[N], woman[N];//姓名 map<string, int> mp; //姓名->序號(hào) 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); //任取一個(gè)while(1){int w = a[m][ p[m]++ ]; //未拒絕此男人的最優(yōu)女人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是較優(yōu)的男人if(t==m){ //m更優(yōu) 重新組合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個(gè)男人的配偶 -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; //姓名->序號(hào) 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]++ ]; //未拒絕此男人的最優(yōu)女人int m1 = hw[w]; //此女人的配偶if( m1 == -1 ){ hw[w]=m; hm[m]=w; break; } //女人無配偶if(c[w][m] < c[w][m1]){ //女人有配偶但m更優(yōu)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; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/ts65213/archive/2013/05/16/3082329.html

總結(jié)

以上是生活随笔為你收集整理的poj 3487 zoj 1576 稳定婚姻的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。