题目链接
题意是中文的,但是却很难理解的说:我们给出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;
}