您的位置:首页 > 其它

GS算法,求婚拒绝算法

2008-09-15 22:02 218 查看
写一下大概算法
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]);
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: