【模板】稳定婚姻问题

闲的没事来开一开,反正挺有趣的。

题目大意

给你\(n\)个男性名字,\(n\)个女性名字\(\left(n\in \left[1,1024\right)\right)\)

接下来\(n\times 2\)行,每行有\(n+1\)个名字,第\(k(k\in \left[2,n+1\right])\)个名字\(ob\)表示\(it\)是第一个名字\(sub\)的第\(k-1\)喜欢的人。

现在你要给他们配对,要求:

每一个人比起现在它的伴侣更喜欢的人喜欢其自己的伴侣甚于那个人。

样例

输入数据1

3
a b c
e d f
a
e d f
b
e d f
c
d f e
d
a c b
e
b a c
f
c a b

输出数据1

a d
b e
c f

输入数据2

4
mary larphy nack nin
jam jack kim sid
mary
jack kim sid jam
larphy
jack sid kim jam
nack
jam kim jack sid
nin
kim sid jack jam
jam
nin larphy nack mary
jack
larphy nack mary nin
kim
mary nin larphy nack
sid
nin nack mary larphy

输出数据2

mary kim
larphy jack
nack jam
nin sid

code

#include <bits/stl_algobase.h>
#include <bits/stl_algo.h>
#include <stdio.h>
#include <queue>
using namespace std;

const int Z = 1024;

int n;
char tmp[Z];

struct TRIE {
	int sid[26];
	int value;
} trie[Z*Z];
int tot;
void add(char _in[],int v) {
	int u = 0;
	for(int i = 1;_in[i];++i) {
		if(!trie[u].sid[_in[i]-'a']) 
			trie[u].sid[_in[i]-'a'] = ++tot;
		u = trie[u].sid[_in[i]-'a'];
	}
	trie[u].value = v;
}
int find(char _aim[]) {
	int u = 0;
	for(int i = 1;_aim[i];++i) {
		if(!trie[u].sid[_aim[i]-'a']) 
			trie[u].sid[_aim[i]-'a'] = ++tot;
		u = trie[u].sid[_aim[i]-'a'];
	}
	return trie[u].value;
}

int malelike[Z][Z], femalelike[Z][Z];
int malechoice[Z], femalechoice[Z];
char name[Z][Z<<1];
queue<int> freemale;
void Gale_Shapley() {
	scanf("%d",&n);
	for(int i = 1;i <= n;++i) {
		scanf("%s",name[i]+1);
		add(name[i],i);
		freemale.push(i);
	}
	for(int i = 1;i <= n;++i) {
		scanf("%s",name[i+n]+1);
		add(name[i+n],i+n);
	}
	for(int i = 1;i <= n;++i) {
		scanf("%s",tmp);
		for(int j = 1;j <= n;++j) {
			scanf("%s",tmp+1);
			int object = find(tmp);
			malelike[i][j] = object-n;
		}
	}
	for(int i = 1;i <= n;++i) {
		scanf("%s",tmp);
		for(int j = 1;j <= n;++j) {
			scanf("%s",tmp+1);
			int object = find(tmp);
			femalelike[i][object] = n-j+1;
		}
		femalelike[i][n+1] = 0;
	}
	for(int i = 1;i <= n;++i) {
		malechoice[i] = 1;
		femalechoice[i] = n+1;
	}
	while(!freemale.empty()) {
		int male = freemale.front();
		int female = malelike[male][malechoice[male]];
		if(femalelike[female][male] > femalelike[female][femalechoice[female]]) {
			freemale.pop();
			if(femalechoice[female] != n+1) {
				freemale.push(femalechoice[female]);
				malechoice[femalechoice[female]]++;
			}
			femalechoice[female] = male;
		} else {
			malechoice[male]++;
		}
	}
	for(int i = 1;i <= n;++i) {
		printf("%s %s\n",name[i]+1,name[malelike[i][malechoice[i]]+n]+1);
	}
}
signed main() {
	Gale_Shapley();
}

@bikuhiku

posted @ 2022-07-11 10:47  bikuhiku  阅读(12)  评论(0编辑  收藏  举报