稳定伴侣问题



源码如下,稍后上分析:


#include<stdio.h>
#include<stdlib.h>

#define SIZE 10
#define FREE -1

void 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:%d	girl:%d\n",boy,girl);
		if(w_eng[girl] == FREE)
		{
			w_eng[girl] = boy;
			m_eng[boy] = girl;
			top--;
			printf("succeed	1\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("succeed	2\n");
		}
		else
			printf("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数组可以实现不同的男女组合。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值