写一下大概算法
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
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;
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;
}
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);
}
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]);
}
}
}