zoukankan      html  css  js  c++  java
  • UVALive 3989Ladies' Choice(稳定婚姻问题)

    题目链接

    题意:n个男生和女生,先是n行n个数,表示每一个女生对男生的好感值排序,然后是n行n列式每一个男生的好感值排序,输出N行,即每个女生在最好情况下的男生的编号

    分析:如果是求女生的最好情况下,就要从女生开始选,这样女生都是从最好的到不好的来选,而男生却相反--只能娶那些自己有可能最没好感的女生,因为男生是被动的,他最喜欢的女生不见的会向他求婚。

    刘汝佳书上命名错了,so也跟着把男生当成女生了,懒得改命名了,

     1 #include <iostream>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <cstdio>
     5 #include <queue>
     6 using namespace std;
     7 const int Max = 1010;
     8 int pref[Max][Max], order[Max][Max], Next[Max];
     9 int future_hasband[Max], future_wife[Max];
    10 queue <int> q; //单身女生队列
    11 void engage(int man, int woman)
    12 {
    13     int m = future_hasband[woman];
    14     if(m)
    15     {
    16         future_wife[m] = 0;
    17         q.push(m);
    18     }
    19     future_hasband[woman] = man;
    20     future_wife[man] = woman;
    21     return;
    22 }
    23 int main()
    24 {
    25     int T;
    26     scanf("%d", &T);
    27     while(T--)
    28     {
    29         int n;
    30         scanf("%d", &n);
    31         while(!q.empty())
    32             q.pop();
    33         for(int i = 1; i <= n; i++)
    34         {
    35             for(int j = 1; j <= n; j++)
    36                 scanf("%d", &pref[i][j]);
    37             future_wife[i] = 0;  // 女生i没有匹配
    38             Next[i] = 1; // 都是从第一个开始查找
    39             q.push(i);  // 加入单身队列
    40         }
    41         for(int i = 1; i <= n; i++)
    42         {
    43             for(int j = 1; j <= n; j++)
    44             {
    45                 int x;
    46                 scanf("%d", &x);
    47                 order[i][x] = j;  // 表示男生i 对 女生 x 的好感等级
    48             }
    49             future_hasband[i] = 0;
    50         }
    51         while(!q.empty())
    52         {
    53             int man = q.front();
    54             q.pop();
    55             int woman = pref[man][Next[man]++];
    56             if(future_hasband[woman] == 0)  // 表示这个男生并没有 匹配
    57                 engage(man, woman);
    58             else if(order[woman][man] < order[woman][future_hasband[woman]])  // 虽然已经匹配了,但是同已经匹配的好感层度来看,更喜欢这个
    59                 engage(man, woman);
    60             else 
    61                 q.push(man); // 否则继续单身,等待下次解救
    62         }
    63         for(int i = 1; i <= n; i++)
    64             printf("%d
    ", future_wife[i]);
    65         if(T)
    66             printf("
    ");
    67     }
    68 
    69     return 0;
    70 }
    View Code
  • 相关阅读:
    C# 接口
    C# 多态
    C# 继承
    C# 封装
    动态规划:从新手到专家
    hduoj题目分类
    4.2 最邻近规则分类(K-Nearest Neighbor)KNN算法应用
    警惕自增的陷阱(++)
    五大常用算法之四:回溯法
    算法java实现--回溯法--图的m着色问题
  • 原文地址:https://www.cnblogs.com/zhaopAC/p/5251798.html
Copyright © 2011-2022 走看看