• UVALive3989 Ladies' Choice —— 稳定婚姻问题 Gale


    题目链接:https://vjudge.net/problem/UVALive-3989

    题解:

    题意:有n个男生和n个女生。每个女生对男神都有个好感度排行,同时每个男生对每个女生也有一个好感度排行。问:怎样配对,才能使的每个女生尽可能幸福。规定在配对的过程中,如果一对男女不是舞伴,且他们喜欢对方的程度都大于当前的舞伴,那么他么会“私奔”,留下他们的舞伴孤零零。由于是要每个女生尽可能幸福,所以女生根据喜欢程度,主动去男生。而男生只能处于被动的状态。

    代码如下:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;
     4 const int INF = 2e9;
     5 const LL LNF = 9e18;
     6 const int mod = 1e9+7;
     7 const int MAXN = 1e3+10;
     8 
     9 int pref[MAXN][MAXN], order[MAXN][MAXN], Next[MAXN];
    10 int future_husband[MAXN], future_wife[MAXN];
    11 queue<int>q;
    12 
    13 void engage(int woman, int man)
    14 {
    15     int w = future_wife[man];
    16     if(w)
    17     {
    18         future_husband[w] = 0;
    19         q.push(w);
    20     }
    21     future_wife[man] = woman;
    22     future_husband[woman] = man;
    23 }
    24 
    25 int main()
    26 {
    27     int T, n;
    28     scanf("%d", &T);
    29     while(T--)
    30     {
    31         scanf("%d", &n);
    32         for(int i = 1; i<=n; i++)
    33         {
    34             for(int j = 1; j<=n; j++)
    35                 scanf("%d", &pref[i][j]);
    36             Next[i] = 1;
    37             future_husband[i] = 0;
    38             q.push(i);
    39         }
    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;
    48             }
    49             future_wife[i] = 0;
    50         }
    51 
    52         while(!q.empty())
    53         {
    54             int woman = q.front(); q.pop();
    55             int man = pref[woman][Next[woman]++];
    56             if(!future_wife[man])
    57                 engage(woman, man);
    58             else if(order[man][woman]<order[man][future_wife[man]])
    59                 engage(woman, man);
    60             else q.push(woman);
    61         }
    62         while(!q.empty()) q.pop();
    63 
    64         for(int i = 1; i<=n; i++)
    65             printf("%d
    ", future_husband[i]);
    66         if(T) printf("
    ");
    67     }
    68 }
    View Code
  • 相关阅读:
    4. RDMA操作类型
    3. RDMA基本元素
    2. 比较基于Socket与RDMA的通信
    1. RDMA概述
    win10 如何开启hyper-v虚拟机
    将Oracle 当前日期加一天、一小时、一分钟
    github搜索案例(axios、pubsub、fetch)
    Tolist案例(父子传参实现增删改)
    5.key的使用
    4.React生命周期
  • 原文地址:https://www.cnblogs.com/DOLFAMINGO/p/7832143.html
Copyright © 2020-2023  润新知