稳定婚姻匹配 G-S算法 JAVA和C++实现

稳定婚姻匹配问题

要求

输入:

(第一行数据表示 Man(Woman)的数目 n;接下来的数据中,第一个 n*n 的数据
块表示 Man 的优先列表;另一个 n*n 的数据块表示 Woman 的优先列表)
5 ———————- (Man(Woman)的数目 n)
2 1 4 5 3 ————– (第一个男人的优先列表)
4 2 1 3 5
2 5 3 4 1 ————– (第三个男人的优先列表)
1 4 3 2 5
2 4 1 5 3
5 1 2 4 3 ————– (第一个女人的优先列表)
3 2 4 1 5
2 3 4 5 1
1 5 4 3 2
4 2 5 3 1

输出

男人 1 到 n 的匹配对象,每个数字后边跟一个空格,最后输出一个\n。

JAVA实现

package gs;

import java.util.Arrays;
import java.util.Scanner;

public class gsalg {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        Woman women[] = new Woman[num];
        Man men[]= new Man[num];

//      System.out.println("num= "+num);

        for(int i=0;i//          System.out.println("输入第 "+(i+1)+"个男人心中的优先顺序");

            int[] a=new int[num];
            for(int j=0;jnew Man();   //必须先初始化
            men[i].setRank(a);

//          System.out.println(Arrays.toString(men[i].rank));
        }

        for(int i=0;i//          System.out.println("输入第 "+(i+1)+"个女人心中的优先顺序");

            int[] a=new int[num];
            for(int j=0;jnew Woman();   //必须先初始化
            women[i].setRank(a);

//          System.out.println(Arrays.toString(women[i].rank));
        }



        for(int i=0;iif(!men[i].isDate()){  //如果i这个男人没有在约会  这个男生是(i+1)号
                int chase =men[i].getRank()[men[i].getBetter()]; //目前最喜欢chase号女生
                System.out.println((i+1)+"号男生目前最喜欢"+chase+"号女生");
                men[i].setBetter(men[i].getBetter()+1); //成功与否都已经向这个女人请求过了
                System.out.println("追求过的数量变为:"+men[i].getBetter());
               if(!women[chase-1].isDate()){ //如果i心仪的女人没有约会
                   men[i].setDate(true);
                   men[i].setPresent(chase);
                   women[chase-1].setDate(true);
                   women[chase-1].setPresent(i+1);
                   System.out.println((i+1)+"号男生和"+chase+"号女生配成一对");
               }
               else{   //这个女人正在约会 对比现在这个男人和正在约会的男人哪个优先级更高
                   System.out.println("女方有约会对象");
                   int later=0,former=0;
                   for(int r=0;r//获取排名
                       if(women[chase-1].getRank()[r]==(i+1)){
                           later=r;
//                         System.out.println("later:"+later);
                       }
                       if(women[chase-1].getRank()[r]==women[chase-1].getPresent()){
                           former=r;
//                         System.out.println("former:"+former);
                       }
                   }
                   if(later>former){//你不如对方正在约会的对象
                       System.out.println("former>later 你不如对方正在约会的对象");
                       i=-1;//有人单身狗,必须重新走
                   }else if(later//你比正在约会的强
                       System.out.println("former);
                       System.out.println(women[chase-1].getPresent()+"被分手");

                       men[women[chase-1].getPresent()-1].setDate(false);//前任被分手
                       men[women[chase-1].getPresent()-1].setPresent(100);


                       men[i].setDate(true);
                       men[i].setPresent(chase);

                       women[chase-1].setPresent(i+1);

                       i=-1;//有人单身狗,必须重新走

                   }else{
//                     System.out.println("former=later 有问题");
                   }
               }
            }
        }

        //循环结束,输出结果

        for(int i=0;iout.print(men[i].getPresent()+" ");
        }

        System.out.println();

    }
}

class People {
    private int id;
    private int better=0;   //追求过几位女生
    private int[] rank;
    private boolean date=false;
    private int present=100;
    private int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getBetter() {
        return better;
    }
    public void setBetter(int better) {
        this.better = better;
    }
    public int[] getRank() {
        return rank;
    }
    public void setRank(int[] rank) {
        this.rank = rank;
    }
    public boolean isDate() {
        return date;
    }
    public void setDate(boolean date) {
        this.date = date;
    }
    public int getPresent() {
        return present;
    }
    public void setPresent(int present) {
        this.present = present;
    }


}

class Woman extends People{

}

class Man extends People{

}

C++实现

#include 
#include 
using namespace std;

int num;

int getRank(int *a,int x){ //找到x在数组中的位置
    for(int i=0;iif(a[i]==x){
            return i;
        }
    }
    return -1;
}

int getGirl(int *a){
    for(int i=0;iif(a[i]!=-1){
            int theGirl=a[i];
            a[i]=-1;
            return theGirl;
        }
    }
    return -1;
}


void gsAlg(int *out,int **manArray, int **ladayArray){

    for(int i=0;iif(out[i]==-1){ //还有单身狗 iL 男士
            int date=getGirl(manArray[i]);//获取当前最喜欢的女生号,并且将此位置换为-1
            cout<<"现在是"<<(i+1)<<"号男生,他现在追求"<"号女生"<<"\n";
            int isdated = getRank(out, date);//>0代表有约会对象
            if(isdated<0){
                out[i]=date; //配对
                cout<<"没有前任"<<(i+1)<<"号男生与"<"号女生成功配对"<<"\n";
            }else{//女生有约会对象
                int formerId=getRank(out,date);//获取正在约会对象的L
                int formerRank=getRank(ladayArray[date-1],(formerId+1));
                int laterRank=getRank(ladayArray[date-1], (i+1));
                for(int i=0;icout<1][i];
                                }
                cout<<"有约会对象,是"<1<<"他的地位:"<"  你的地位:"<"\n";
                if(laterRank>formerRank){//你的排名靠后,不如前任
                    i=-1;
                    cout<<"你的排名靠后,不如前任\n";
                }else{//排名比前任强
                    out[i]=date;    //成功上位
                    out[formerId]=-1;//前任被分手
                    i=-1;
                    cout<1<<"被分手\n"; 
                }


            }


        }
    }
}

int main(int argc, const char * argv[]) {


    cin>>num;
    int **manArray= new int *[num];
    int **womanArray= new int *[num];

//    cout<<"Enter a number:\n";


//    cout<<"Now enter the orders:\n";



    for(int i=0;inew int[num];  //一维数组赋值
    }
    for(int i=0;inew int[num];  //一维数组赋值
    }

    //输入
    for(int i =0;ifor(int j=0;jcin>>manArray[i][j];
        }
    }

    for(int i =0;ifor(int j=0;jcin>>womanArray[i][j];
        }
    }
//    for(int i=0;i
//        for(int j=0;j
//            cout<
//        }
//        cout<<"\n";
//    }
//        
//    for(int i=0;i
//        for(int j=0;j
//            cout<
//        }
//        cout<<"\n";
//    }



    int *out =new int[num]; //输出结果的数组

    for(int i=0;i//先都初始化为-1
        out[i]=-1;

    }


    gsAlg(out,manArray,womanArray);

    for(int i=0;i//最终结果输出
        cout<" ";
    }


    return 0;

}

总结

由书上的伪代码转换为具体语言实现,逻辑并不复杂但是需要注意的小地方有很多。

对于循环来说,如果有人被分手,那么就要重新循环一次,考虑如果使用栈的数据结构会提高效率。

个人觉得JAVA写的十分繁琐,还可以精简很多。

你可能感兴趣的:(算法)