1 3 1 1 60.57 57.16 69.27 2 2 26.05 61.06 11.52 3 3 9.04 58.20 56.90 1 2 280.74 12.78 316.14 2 3 305.16 267.15 87.65 3 1 240.72 312.41 217.10
3 1 1 2 2 3
此题也是一个比较明显的稳定婚姻问题,比较麻烦的就是需要算出两两之间的距离,再进行排序,排序的过程还要考虑进去容量的关系。
#include<iostream> #include<queue> #include<cstring> #include<cstdio> #include<string> #include<cmath> #include<algorithm> using namespace std; #define N 205 int engage[N],n; int boy[N][N],girl[N][N]; void Gale_Shapley() { queue<int> q; int boyid,girlid; for(int i=1; i<=n; i++) { engage[i]=0; boy[i][0]=1; q.push(i); } while(!q.empty()) { boyid=q.front(); girlid=boy[boyid][boy[boyid][0]++]; if(engage[girlid]==0) { engage[girlid]=boyid; q.pop(); } else { int i; for(i=1; i<=n; i++) if(girl[girlid][i]==boyid||girl[girlid][i]==engage[girlid]) break; if(girl[girlid][i]==boyid) { q.push(engage[girlid]); engage[girlid]=boyid; q.pop(); } } } } struct dis { double s; double c; int id; }; struct type { double c; double x,y,z; dis D[N]; }O[N],I[N]; void cal_dis(int x) { for(int i=1;i<=n;i++) { double d=0; d+=(O[x].x-I[i].x)*(O[x].x-I[i].x); d+=(O[x].y-I[i].y)*(O[x].y-I[i].y); d+=(O[x].z-I[i].z)*(O[x].z-I[i].z); d=sqrt(d); O[x].D[i].s=d; O[x].D[i].id=i; O[x].D[i].c=I[i].c; I[i].D[x].s=d; I[i].D[x].id=x; I[i].D[x].c=O[x].c; } } bool cmp(dis a,dis b) { if(a.s==b.s) return a.c>b.c; return a.s<b.s; } int main(void) { int t; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=1; i<=n; i++) { int id; scanf("%d",&id); scanf("%lf%lf%lf%lf",&O[id].c,&O[id].x,&O[id].y,&O[id].z); } for(int i=1; i<=n; i++) { int id; scanf("%d",&id); scanf("%lf%lf%lf%lf",&I[id].c,&I[id].x,&I[id].y,&I[id].z); } for(int i=1; i<=n; i++) cal_dis(i); for(int i=1; i<=n; i++) { sort(O[i].D+1,O[i].D+n+1,cmp); for(int j=1; j<=n; j++) boy[i][j]=O[i].D[j].id; } for(int i=1; i<=n; i++) { sort(I[i].D+1,I[i].D+n+1,cmp); for(int j=1; j<=n; j++) girl[i][j]=I[i].D[j].id; } Gale_Shapley(); int X[N],Y[N]; for(int i=1; i<=n; i++) { X[i]=i; Y[i]=engage[i]; } for(int i=1; i<=n; i++) printf("%d %d\n",Y[i],X[i]); printf("\n"); } }