1. 程式人生 > >Marriage is Stable HDU1522 穩定婚姻問題

Marriage is Stable HDU1522 穩定婚姻問題

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;
#define
N 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 穩定婚姻問題