您的位置:首页 > 其它

稳定婚姻问题

2016-07-18 01:36 387 查看
ACM模版

稳定婚姻问题

/*
*  稳定婚姻问题O(n^2)
*/
const int N = 1001;
struct People
{
bool state;
int opp, tag;
int list
;        //  man使用
int priority
;    //  woman使用,有必要的话可以和list合并,以节省空间
void Init()
{
state = tag = 0;
}
} man
, woman
;

struct R
{
int opp;
int own;
} requst
;
int n;
void Input();
void Output();
void stableMatching();

int main()
{
Input();
stableMatching();
Output();

return 0;
}

void Input()
{
scanf("%d\n", &n);
int i, j, ch;
for (i = 0; i < n; ++i)
{
man[i].Init();
for(j = 0; j < n; ++j)
{   //  按照man的意愿递减排序
scanf("%d", &ch);
man[i].list[j] = ch - 1;
}
}
for (i = 0; i < n; ++i)
{
woman[i].Init();
for (j = 0; j < n; ++j)
{   //  按照woman的意愿递减排序,但是,存储方法与man不同
scanf("%d", &ch);
woman[i].priority[ch - 1] = j;
}
}
return ;
}

void stableMatching()
{
int k;
for (k = 0; k < n; ++k)
{
int i, id = 0;
for (i = 0; i < n; ++i)
{
if (man[i].state == 0)
{
requst[id].opp = man[i].list[man[i].tag];
requst[id].own = i;
man[i].tag += 1;
++id;
}
}
if (id == 0)
{
break;
}
for (i = 0; i < id; i++)
{
if (woman[requst[i].opp].state == 0)
{
woman[requst[i].opp].opp = requst[i].opp;
woman[requst[i].opp].state = 1;
man[requst[i].own].state = 1;
man[requst[i].own].opp = requst[i].opp;
}
else
{
if (woman[requst[i].opp].priority[woman[requst[i].opp].opp] >woman[requst[i].opp].priority[requst[i].own])
{
man[woman[requst[i].opp].opp].state = 0;
woman[requst[i].opp].opp = requst[i].own;
man[requst[i].own].state = 1;
man[requst[i].own].opp = requst[i].opp;
}
}
}
}
return ;
}

void Output()
{
for (int i = 0; i < n; i++)
{
printf("%d\n", man[i].opp + 1);
}
return ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  稳定婚姻问题