稳定伴侣问题

来源:互联网 发布:mindjet mac 破解 编辑:程序博客网 时间:2024/06/02 13:03



源码如下,稍后上分析:


#include<stdio.h>#include<stdlib.h>#define SIZE 10#define FREE -1void get_mem(int [][SIZE],int ,int ***,int **,int **);void release_mem(int **,int *,int *);void stable_marriage(int man[][SIZE],int woman[][SIZE],int n,int m_eng[],int w_eng[]){int **rank;int *waiting;int *next;int boy,girl,top;get_mem(woman,n,&rank,&waiting,&next);for(girl = 0;girl < n;girl++)w_eng[girl] = -1;for(top = n - 1;top >= 0;){boy = waiting[top];girl = man[boy][(next[boy]) ++];printf("boy:%dgirl:%d\n",boy,girl);if(w_eng[girl] == FREE){w_eng[girl] = boy;m_eng[boy] = girl;top--;printf("succeed1\n");}else if(rank[girl][boy] < rank[girl][w_eng[girl]]){waiting[top] = w_eng[girl];w_eng[girl] = boy;m_eng[boy] = girl;printf("succeed2\n");}elseprintf("failed\n");}release_mem(rank,waiting,next);}void get_mem(int w[][SIZE],int n,int ***rank,int **wait,int **next){int i,j;*rank = (int **)malloc(sizeof(int *) * n);*wait = (int *)malloc(sizeof(int) * n);*next = (int *)malloc(sizeof(int) * n);(*rank)[0] = (int *)malloc(sizeof(int) * n * n);for(i = 1;i < n;i++)(*rank)[i] = (*rank)[i - 1] + n;for(i = 0;i < n;i++){(*wait)[i] = n - 1 - i;(*next)[i] = 0;for(j = 0;j < n;j++)(*rank)[i][w[i][j]] = j;}}void release_mem(int **rank,int *wait,int *next){free(rank[0]);free(rank);free(wait);free(next);}int main(){int i;int boy[][SIZE] = {{0},{2,4,1,3},{3,1,4,2},{2,3,1,4},{4,1,3,2}};int girl[][SIZE] = {{0},{2,1,4,3},{4,3,1,2},{1,4,3,2},{2,1,4,3}};int m_eng[5];int w_eng[5];stable_marriage(boy,girl,5,m_eng,w_eng);for(i = 1;i <= 4;i++)printf("%d\t%d\n",i,m_eng[i]);return 0;}

替换主函数中的boy和girl数组可以实现不同的男女组合。