匹配/对集问题
定义

翻译成人话就是,匹配要求边集中任何两条边不相邻,最大匹配要求边数最多,完全匹配要求所有顶点都包含。
霍尔婚姻定理 HALL’S MARRIAGE THEOREM

稳定匹配问题
问题描述:给出一个$n$个男性的集合$M$和$n$个女性的集合$W$,找到一个“稳定”匹配。
每位男性根据对女性的心仪程度从高至低进行排名;
每位女性根据对男性的心仪程度从高至低进行排名;
不稳定对:给出一个完美匹配$S$,男性$m$和女性$w$是不稳定的,如果同时满足下列条件:
$m$相比起当前配偶,更喜欢$w$;
$w$相比起当前配偶,更喜欢$m$;
稳定匹配:一个不包含不稳定对的完美匹配。
Gale-Shapley 算法(延迟决定法)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| #include<iostream> using namespace std; const int N = 10005; int M[N] = {0}, W[N] = {0}; int M_pri[N][N] = {0}, W_pri[N][N] = {0};
void getPri(int n); void G_S(int num); void output(int num); bool lovemore(int m,int w,int num);
void getPri(int n) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cin >> M_pri[i][j]; } }
for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cin >> W_pri[i][j]; } } }
void G_S(int num) { int m, w; while (M[0] != num) { w = m = 0; while (M[++m] != 0) ; w = M_pri[m][++M_pri[m][0]]; if (W[w]) { if (lovemore(m,w,num)) { M[W[w]] = 0; M[m] = w; W[w] = m; } else continue; } else { M[m]=w; M[0]++; W[w]=m; W[0]++; } } }
bool lovemore(int m,int w,int num) { for (int i = 0; i < num; i++) { if (W_pri[w][i] == W[w]) { return false; } if (W_pri[w][i] == m) { return true; } } }
void output(int num) { for (int i = 1;i <= num; i++) cout<<"("<<i<<", "<<M[i]<<")"<<endl; }
void solve() { int n; cin>>n; getPri(n); G_S(n); output(n); }
int main() { solve(); return 0; }
|