The Stable Marriage Problem(稳定婚姻选择问题,二分图)

The Stable Marriage Problem

思路:

稳定婚姻选择问题的模板。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<unordered_map>
#include<queue>
using namespace std;
queue <int> q;
unordered_map <char,int> mp;
const int maxn = 120;
int order[maxn][maxn],pref[maxn][maxn];
char an[maxn];
int nxt[maxn],fu_wif[maxn],fu_has[maxn];
void engage(int man,int woman){
	int m = fu_has[woman];
	if(m){
		fu_wif[m] = 0;
		q.push(m);
	}
	fu_wif[man] = woman;
	fu_has[woman] = man;
}
int main(void)
{
	char s1[30],s2[5];
	int n,T,i,j,x,y;
	scanf("%d",&T);
	while(T--){
		mp.clear();
		while(!q.empty()) q.pop();
		scanf("%d",&n);
		for(i=1;i<=n*2;i++){
			scanf("%s",s2);
			mp[s2[0]] = i;
			an[i] = s2[0];
		}
		for(i=1;i<=n;i++){
			scanf("%s",s1+1);
			int len = strlen(s1+1);
			for(j=3;j<=len;j++){
				pref[i][j-2] = mp[s1[j]];
			}
			nxt[i] = 1;
			fu_wif[i] = 0;
			q.push(i);
		}
		for(i=1;i<=n;i++){
			scanf("%s",s1+1);
			int len = strlen(s1+1);
			for(j=3;j<=len;j++){
				order[i+n][mp[s1[j]]] = j-2;
			}
			fu_has[i+n] = 0;
		}
		
		while(!q.empty()){
			int man = q.front();q.pop();
			int woman = pref[man][nxt[man]++];
			if(!fu_has[woman]) engage(man,woman);
			else if(order[woman][man]<order[woman][fu_has[woman]]) engage(man,woman);
			else q.push(man);
		}
		
		for(i=1;i<=n;i++) printf("%c %c\n",an[i],an[fu_wif[i]]);
		if(T) printf("\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41829060/article/details/89244121