Marriage is Stable HDU1522 穩定婚姻問題
阿新 • • 發佈:2019-02-17
sizeof eof scanf pac ios ace tab ble cout
幾對男女 給出每個人心中的優先級 進行最合理的匹配
要打印名字的話必須有一個名字數組
英文名用map
穩定婚姻問題:
每次循環遍歷所有的男的
每個男的對目前未被拒絕的並且優先級最高的進行預匹配 如果1女的沒有伴侶2女的對該男的好感度比女的伴侶的好感度更高 滿足任意一個則進行匹配
不斷循環直到所有男的都有伴侶
#include<cstdio> #include<string> #include<map> #include<iostream> #include<cstring> using namespace std; #defineN 20 map<string,int>mp_boy,mp_girl; int girl[N][N],boy[N][N];//girl數組存放 第i個女對第j個男的好感度 boy數組存放第i個男的第j優先好感度為誰 int match_girl[N],match_boy[N]; string name_boy[N],name_girl[N]; int rank1[N]; int main() { mp_boy.clear();mp_girl.clear(); int n; while(scanf("%d",&n)==1) {string name,str; int cnt=0; for(int i=1;i<=n;i++) { cin>>name; mp_boy[name]=i; name_boy[i]=name; for(int j=1;j<=n;j++) { cin>>str; int t=mp_girl[str];if(!t) mp_girl[str]=t=++cnt,name_girl[cnt]=str; boy[i][j]=t; } } for(int i=1;i<=n;i++) { cin>>name; for(int j=1;j<=n;j++) { cin>>str; int t=mp_boy[str]; girl[ mp_girl[name] ][t]=n-j; } } memset(match_boy,0,sizeof match_boy); memset(match_girl,0,sizeof match_girl); memset(rank1,0,sizeof rank1); int flag=1; while(flag) { flag=0; for(int i=1;i<=n;i++) { if(!match_boy[i]) { int temp=boy[i][ rank1[i]++ ]; if(!match_girl[temp]) match_boy[i]=temp,match_girl[temp]=i; else if( girl[temp][i]>girl[temp][ match_girl[temp] ] ) { match_boy[ match_girl[temp] ]=0; match_boy[i]=temp; match_girl[temp]=i; } flag=1; } } } for(int i=1;i<=n;i++) cout<<name_boy[i]<<" "<<name_girl[ match_boy[i] ]<<endl; } }
Marriage is Stable HDU1522 穩定婚姻問題