Stable Match 【HDU - 1435】【稳定婚姻系统】

题目链接


  题意是中文的,但是却很难理解的说:我们给出C个(我在代码里用N来表示),有N个发射器和N个接收器,要求是让发射器与接收器达成稳定匹配,也就是稳定婚姻匹配问题了。

  我们先把每个发射器到接收器的距离都处理出来,然后就是比较大小,然后婚姻匹配了(我这都没加上比较容量的,就过了)。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxN = 205;
int N, re_a[maxN], re_b[maxN];
struct node
{
    int id, v;
    double x, y, z;
    node(int a=0, int b=0, double c=0, double d=0, double f=0):id(a), v(b), x(c), y(d), z(f) {}
}a[maxN], b[maxN];
inline double Dis(node e1, node e2) { return sqrt( (e1.x - e2.x) * (e1.x - e2.x) + (e1.y - e2.y) * (e1.y - e2.y) + (e1.z - e2.z) * (e1.z - e2.z) ); }
bool cmp_ID(node e1, node e2) { return e1.id < e2.id; }
struct favourite
{
    int id;
    double val;
    favourite(int a=0, double b=0):id(a), val(b) {}
}lovers[maxN];
bool cmp(favourite e1, favourite e2) { return e1.val < e2.val; }
int boy_love_who[maxN][maxN], girl_love_fir[maxN][maxN];
int boy[maxN], girl[maxN], kth[maxN];
inline void G_S()
{
    for(int i=1; i<=N; i++) boy[i] = girl[i] = kth[i] = 0;
    bool flag;
    while(true)
    {
        flag = false;
        for(int i=1; i<=N; i++)
        {
            if(!boy[i])
            {
                int g = boy_love_who[i][++kth[i]];
                if(!girl[g])
                {
                    girl[g] = i;
                    boy[i] = g;
                    continue;
                }
                else if(girl_love_fir[g][i] < girl_love_fir[g][girl[g]])
                {
                    girl[g] = i;
                    boy[i] = g;
                }
                flag = true;
            }
        }
        if(!flag) break;
    }
    for(int i=1; i<=N; i++)
    {
        printf("%d %d\n", girl[i], i);
    }
}
int main()
{
    int T; scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &N);
        for(int i=1; i<=N; i++)
        {
            scanf("%d%d%lf%lf%lf", &a[i].id, &a[i].v, &a[i].x, &a[i].y, &a[i].z);
            re_a[a[i].id] = i;
        }
        sort(a + 1, a + N + 1, cmp_ID);
        for(int i=1; i<=N; i++)
        {
            scanf("%d%d%lf%lf%lf", &b[i].id, &b[i].v, &b[i].x, &b[i].y, &b[i].z);
            re_b[b[i].id] = i;
        }
        sort(b + 1, b + N + 1, cmp_ID);
        for(int i=1; i<=N; i++)
        {
            for(int j=1; j<=N; j++)
            {
                lovers[j] = favourite(j, Dis(a[i], b[j]));
            }
            sort(lovers + 1, lovers + N + 1, cmp);
            for(int j=1; j<=N; j++)
            {
                boy_love_who[i][j] = lovers[j].id;
            }
            for(int j=1; j<=N; j++)
            {
                lovers[j] = favourite(j, Dis(b[i], a[j]));
            }
            sort(lovers + 1, lovers + N + 1, cmp);
            for(int j=1; j<=N; j++)
            {
                girl_love_fir[i][lovers[j].id] = j;
            }
        }
        G_S();
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wuliwuliii

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值