稳定婚姻小模版(来自HDU)

稳定婚姻是二分图匹配的一种

原模版几个变量有问题 进行过修正 贴代码如下:

 

 

#include  < iostream >
#include 
< queue >
using   namespace  std;

#define  MAX 1010

int  n;
int  mlove[MAX][MAX];
int  wlove[MAX][MAX]; 
int  couple[MAX];
int  pare[MAX];

queue 
<   int   >  SQ;
void  gale_shapley()
{
    
int  i,man,woman;
    
    
while ( ! SQ.empty()) 
        SQ.pop();
    memset(couple, 
- 1 sizeof (couple));
    
    
for (i = 1 ;i <= n;i ++
        SQ.push(i);
    
    
    
while ( ! SQ.empty())
    {
        man 
=  SQ.front();    
        SQ.pop();
        
for (i = 1 ;i <= n;i ++ )
        {
            
if (mlove[man][i]  !=   - 1 ) // 如男生未选择过该女生
            {
                
// 选择未被拒绝且最喜欢的女生
                woman  =  mlove[man][i]; // 挑选最喜欢的女生
                mlove[man][i]  =   - 1 ; // 选择并标记之
                 long  pre  =  couple[woman];
                
if (pre  ==   - 1 // 若没有女生未配对
                {
                    couple[woman] 
=  man; // 撮合之
                    pare[man]  =  woman; // 撮合之
                     break ;
                }
                
else   // 若已配对
                {
                    
if (wlove[woman][man]  >  wlove[woman][pre]) // 如果女生喜欢这个男生超过现在的
                    {
                        SQ.push(pre);
// 把现在的放到队列里
                        couple[woman]  =  man; // 撮合之
                        pare[man]  =  woman; // 撮合之                
                         break ;
                    }
                }
            }
        }
    }
/ while
}

int  main()
{
    
int  i, j, t, hj;
    scanf(
" %d " & t);
    
while (t -- )
    {
        scanf(
" %d " & n);
        
for (i  =   1 ; i  <=  n; i ++ )
        {
            
for (j  =   1 ; j  <=  n; j ++ )
            {
                scanf(
" %d " & mlove[i][j]); // 记录喜欢的人的号码
            }
        }
        
for (i  =   1 ; i  <=  n; i ++ )
        {
            
for (j  =   1 ; j  <=  n; j ++ )
            {
                scanf(
" %d " & hj);
                wlove[i][hj] 
=  n  -  j; // 记录喜欢程度从大到小
            }
        }
        
        gale_shapley();

        
for (i  =   1 ; i  <=  n; i ++ )
            printf(
" %d\n " , pare[i]); // 对于男方的配偶
    }
    
return   0 ;
}

你可能感兴趣的:(HDU)