题意:
T个测试数据
一个n*n矩阵
[i,j] 表示i男喜欢j女的程度
问:
一个匹配使得婚姻稳定(如果存在一对不是夫妻但比喜欢当前的对偶更喜欢对方,则他们会在一起,这样得到的匹配是不稳定的)
#include<stdio.h>
#include<queue>
#include<string.h>
#include<iostream>
using namespace std;
#define N 1010
#define next nex
int pref[N][N], order[N][N], next[N];
int future_husband[N], future_wife[N];
queue<int>q;
void engage(int man, int woman){
int m = future_husband[woman];
if(m)
future_wife[m] = 0, q.push(m);
future_wife[man] = woman;
future_husband[woman] = man;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;scanf("%d",&n);
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++)scanf("%d",&pref[i][j]);
next[i] = 1;
future_wife[i] = 0;
q.push(i);
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++)
{
int x;scanf("%d",&x);
order[i][x] = j;
}
future_husband[i] = 0;
}
while(!q.empty()){
int man = q.front(); q.pop();
int woman = pref[man][next[man]++];
if(!future_husband[woman])engage(man, woman);
else if(order[woman][man] < order[woman][future_husband[woman]])
engage(man,woman);
else q.push(man);
}
while(!q.empty())q.pop();
for(int i = 1; i <= n; i++)printf("%d\n", future_wife[i]);
if(T) puts("");
}
return 0;
}