原题POJ 3487
稳定婚姻问题的解法,男士主动,女士被动,每次找一个光棍的男士对他最满意的女士求婚,如果女士是未婚或者女士当前的未婚夫在女士心目中不如他,就把男士定为女士的未婚夫,一直进行循环。
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<queue> #define maxn 1000 using namespace std; int pref[maxn][maxn]; int prem[maxn][maxn]; int future_h[maxn],future_w[maxn]; int next[maxn]; int numh[30],numw[30]; char numw1[30]; queue<int> q; char ss[1005]; void maried(int h,int w) { int m=future_h[w]; if(m) { future_w[m]=0; q.push(m); } future_h[w]=h; future_w[h]=w; } int main() { int t; scanf("%d",&t); while(t--) { int n; int i,j; scanf("%d",&n); int r1=0,r2=0; memset(numh,0,sizeof(numh)); memset(numw,0,sizeof(numw)); while(1) { char k; scanf("%c",&k); if(k>=‘a‘&&k<=‘z‘) { numh[k-‘a‘]=++r1; } else if(k>=‘A‘&&k<=‘Z‘) { numw[k-‘A‘]=++r2; numw1[r2]=k; } if(r1==n&&r2==n) break; } getchar(); for(i=1;i<=n;i++) { char p; scanf("%c:",&p); int c=numh[p-‘a‘]; scanf("%s",ss); getchar(); int len=strlen(ss); for(j=0;j<len;j++) { int c1=numw[ss[j]-‘A‘]; pref[c][j+1]=c1; //printf("%d-%d\n",j+1,c1); } future_w[c]=0; next[c]=1; q.push(c); } for(i=1;i<=n;i++) { char p; scanf("%c:",&p); int c=numw[p-‘A‘]; scanf("%s",ss); int len=strlen(ss); for(int j=0;j<len;j++) { int c1=numh[ss[j]-‘a‘]; prem[c][c1]=j+1; } future_h[i]=0; getchar(); } while(!q.empty()) { int man=q.front();q.pop(); int woman=pref[man][next[man]++]; if(future_h[woman]==0) maried(man,woman); else if(prem[woman][man]<prem[woman][future_h[woman]]) maried(man,woman); else q.push(man); } for(i=‘a‘;i<=‘z‘;i++) { if(numh[i-‘a‘]) { printf("%c %c\n",i,numw1[future_w[numh[i-‘a‘]]]); } } if(t) printf("\n"); } return 0; }
稳定婚姻问题
时间: 2024-11-08 00:42:19