LightOJ 1400 - Employment【稳定婚姻问题】

来源:互联网 发布:mac迅雷没速度 编辑:程序博客网 时间:2024/05/21 10:07

题目连接:http://www.lightoj.com/volume_showproblem.php?problem=1400

代码:

#include <stdio.h>#include <iostream>#include <math.h>#include <stdlib.h>  #include <ctype.h>  #include <algorithm>  #include <vector>  #include <string.h>  #include <queue>  #include <stack>  #include <set>  #include <map>  #include <string>  #include <sstream>  #include <malloc.h>using namespace std;const int MAXN = 1010;int pref[MAXN][MAXN], order[MAXN][MAXN], Next[MAXN];int future_husband[MAXN], future_wife[MAXN];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, cases = 1;    scanf("%d",&t);    while (t--)    {        while (!q.empty()) q.pop();        memset(future_husband, 0, sizeof(future_husband));        memset(future_wife, 0, sizeof(future_wife));        memset(Next, 0, sizeof(Next));        int  n;        scanf("%d", &n);        for (int i = 1;i <= n;i++)        {            for (int j = 1;j <= n;j++)            {                int x;                scanf("%d", &x);                pref[i][j] = x - n;            }            Next[i] = 1;            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;            }        }        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);        }        printf("Case %d:", cases++);        for (int i = 1;i <= n;i++)            printf(" (%d %d)", i,future_wife[i] + n);        printf("\n");    }    return 0;}
0 0