GS算法,求婚拒绝算法

 
写一下大概算法
while  存在男人m是自由的且还没对每个女人都求过婚
      选择这个男人m
                令w是m的优先表中还没求过婚的最高排名的女人
        if  w是自由的 
            (m,w)变成约会状态
        else  w当前与m1约会
              if  w更偏爱m1而不爱m
                                  m保持自由
              else    w更偏爱m而不爱m1
                                        (m,w)变成约会状态
                    m1变成自由
              endif
                  endif
endwhile
 
 
package algorithm;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;
 
public class Stablematch {
 //这个方法返回了当前男人在女人优先表中的位置
 private static  int index(int[][]array,int NowManNo,int WoManNo,int Number)
  {int index=-1;
   for(int i=0;i<Number;i++)
   { if(array[WoManNo][i]==NowManNo)
    { index=i;
        break;
    }
   }
   return index;
  }

 public static void main(String args[])
 {
  //存储男人相对女人的优先表
  //先输入参与匹配的男人和女人的人数
   
  System.out.println("请输入参与匹配的男人和女人的数目");
 
  Scanner sc = new Scanner(System.in);
     int number = sc.nextInt();
     int[][] MPW=new int[number][number];
     int[][] WPM=new int [number][number];
     int[][] pair=new int [number][number];
  try {
     Scanner scf = new Scanner(new File("data.txt"));
     for(int i=0;i<number;i++)
             for(int j=0;j<number;j++)
             {
              MPW[i][j]=scf.nextInt();
             }
     for(int i=0;i<number;i++)
             for(int j=0;j<number;j++)
             {
              pair[i][j]=0;
             }
       for(int i=0;i<number;i++)
              for(int j=0;j<number;j++)
              {
              WPM[i][j]=scf.nextInt();
              }
      
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch blok
   e.printStackTrace();
  }
    Stack Manfree=new Stack<Integer>();
     ArrayList Womenfree=new ArrayList <Integer>();
     int[] Next=new int [number];//在优先表上下一个要选择的女人
     int[] current=new int [number];//当前女人选择约会的男人
     for(int i=0;i<number;i++)
      {Next[i]=0;
      current[i]=-1; //初始情况下没有约会
      }
        for(int i=0;i<number;i++)
      {Manfree.push(i);
      Womenfree.add(i);
      }
       
        while(!Manfree.isEmpty())
         {              Integer ManNo=(Integer)Manfree.peek();
                            int ManNum=ManNo.intValue();
                           
         int  MWW=MPW[ManNum][Next[ManNum]];
           if(Womenfree.contains(MWW))
              {
              pair[MWW][ManNum]=1;
              current[MWW]=ManNum;
              Manfree.pop();
              Womenfree.remove((Integer)MWW);
              }
             else  //判断这个女人当前男人与当前求婚的男人做个比较
           
 if(index(WPM,ManNum,MWW,number)<index(WPM,current[MWW],MWW,number))
 {
    pair[MWW][ManNum]=1;
  
    Manfree.pop();
    Manfree.push((Integer) current[MWW]);
  current[MWW]=ManNum;
  Womenfree.remove((Integer)MWW);
    }
 Next[ManNum]++;
          }       
        
        
        
        
        
        
 
        for(int i=0;i<number;i++)
            for(int j=0;j<number;j++)
            {
           System.out.println( pair[i][j]);
            }

 
 }
}
 
 
 
 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值