hdu 1435 Stable Match (稳定匹配)
来源:互联网 发布:mac nice to meet you 编辑:程序博客网 时间:2024/06/02 04:05
Stable Match
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 811 Accepted Submission(s): 389
Special Judge
Problem Description
Network 公司的BOSS 说现在他们公司建立的信号发射站和接收站经常出现信号发送接收不稳定的问题,信号的稳定度被定义为发射点到接收点的距离,距离越大,越不稳定,所以发射点跟接收点在可能的情况下应越近越好.
BOSS给8600的任务就是::建立一个匹配表,使得一个发射点对应一个接收点,对于某一个发射点来说,它的接收点离它越近那么就会更稳定,同样对于接收点也是一样的情况. 匹配的目标是使得整个网络变得稳定。,对于某2个匹配,比如,( a ---- 1) ,(b----2) ,如果发射点a 离接收点2 比 1要近,而且2 也离 发射点a要比 b 近, 那么 a 就很有可能把信号发到 2中,我们就说这个搭配是不 稳定的。同样如果发射点b 离接收点1 比 2 要近,而且1 也离 发射点b要比 a 近 ,也会出现不稳定的情 况. 而且每个点都有一个容量值,如果对于一个发射点到2个接收点的距离一样的话,它将首先选择容量大的那个. 所以8600就是要建立一个稳定的匹配,使得每个一个信号发射点对应一个接收点,并且不会出现信号不稳定的情况.
8600苦思冥想也没什么进展,希望你能帮他解决这个难题.
BOSS给8600的任务就是::建立一个匹配表,使得一个发射点对应一个接收点,对于某一个发射点来说,它的接收点离它越近那么就会更稳定,同样对于接收点也是一样的情况. 匹配的目标是使得整个网络变得稳定。,对于某2个匹配,比如,( a ---- 1) ,(b----2) ,如果发射点a 离接收点2 比 1要近,而且2 也离 发射点a要比 b 近, 那么 a 就很有可能把信号发到 2中,我们就说这个搭配是不 稳定的。同样如果发射点b 离接收点1 比 2 要近,而且1 也离 发射点b要比 a 近 ,也会出现不稳定的情 况. 而且每个点都有一个容量值,如果对于一个发射点到2个接收点的距离一样的话,它将首先选择容量大的那个. 所以8600就是要建立一个稳定的匹配,使得每个一个信号发射点对应一个接收点,并且不会出现信号不稳定的情况.
8600苦思冥想也没什么进展,希望你能帮他解决这个难题.
Input
输入数据首先包含一个正整数N,N<=20表示测试实例的个数.每个实例首先是一个整C,C<=200表示有C个信号发射点和C个信号接收点. 接下来的C行表示 C个发射点的编号,容量和坐标,坐标为,x,y,z 3个实数(x,y,z ≥0).最后C行是C个接收点的编号,容量和坐标.
Output
输出建立稳定搭配后各个发射点和接收点的编号,每一行代表一个搭配,前一个整数为发射点的编号,后一个为对应的接收点的编号。如果有多种情况,输出其中一种即可.如果任务不可能完成的话,输出"Impossible".每个实例后请输出一个空行.
Sample Input
131 1 60.57 57.16 69.272 2 26.05 61.06 11.523 3 9.04 58.20 56.901 2 280.74 12.78 316.142 3 305.16 267.15 87.653 1 240.72 312.41 217.10
Sample Output
3 11 22 3
稳定匹配算法详解:http://blog.csdn.net/cscmaker/article/details/8291131
http://blog.csdn.net/zy691357966/article/details/46713927
#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#include<stack>#define exp 1e-5#define MAXN 205using namespace std;typedef struct location{ double x,y,z; int power,num;}loca;typedef struct Distance{int pos;int power;int manRank;double distance_;}dis;int c;loca station[MAXN]; //发射站loca receive[MAXN]; //接收站stack<int> manstack;int manrank[MAXN][MAXN],womenrank[MAXN][MAXN]; //分别表示男人排名为j的女生,女人心中第j个男生的排名int manstart[MAXN],manmatch[MAXN],womensingle[MAXN]; //manstart[i]表示第i位男生选取的是心目中第几位的女生//manmatch[i]第i位男生选中的女生的编号,womensingle[i]第i位女生对应男生的编号double Calculatedistance(loca a,loca b){ double X,Y,Z; X=a.x-b.x; Y=a.y-b.y; Z=a.z-b.z; return sqrt(X*X+Y*Y+Z*Z);}int cmp(dis a,dis b){if(fabs(a.distance_-b.distance_)<exp){return a.power>b.power;}else{return a.distance_<b.distance_;}}int cmp1(dis a,dis b){return a.pos<b.pos;}void calculaterank(int rank[][MAXN],loca man[],loca women[],int frank[][MAXN]) //standard是要根据排序得到排名的数组,sta是{int j;dis Sort_[MAXN];for(int i=0;i<c;i++){for(j=0;j<c;j++){Sort_[j].pos=j; //记录编号Sort_[j].power=women[j].power;Sort_[j].distance_=Calculatedistance(man[i],women[j]);}sort(Sort_,Sort_+c,cmp); //根据距离排序for(j=0;j<c;j++){rank[i][j]=Sort_[j].pos; //第i名男士喜欢的排名为j的女士的编号}}for(int i=0;i<c;i++) //第i位女生{memset(Sort_,0,sizeof(Sort_));for(j=0;j<c;j++){Sort_[j].pos=j; //记录编号Sort_[j].power=man[j].power;Sort_[j].distance_=Calculatedistance(women[i],man[j]);}sort(Sort_,Sort_+c,cmp); //根据距离排序/*for(j=0;j<c;j++){Sort_[j].manRank=j;}sort(Sort_,Sort_+c,cmp1);*/for(j=0;j<c;j++){frank[i][Sort_[j].pos]=j; //第i位女生心中编号为Sort_[i].pos的男生的排名}}}void onceGS(int manpos) //现在的男生编号为i{int lovelady=manrank[manpos][manstart[manpos]]; //if(womensingle[lovelady]==-1) //现在男成功脱单{womensingle[lovelady]=manpos;manmatch[manpos]=lovelady;}else{int oldman=womensingle[lovelady];if(womenrank[lovelady][oldman]<womenrank[lovelady][manpos]) //现在男逆袭失败{ manstart[manpos]++;manstack.push(manpos);}else //现在男成功逆袭脱单,过去男落单{womensingle[lovelady]=manpos;manmatch[manpos]=lovelady;manstart[oldman]++;manstack.push(oldman);}}}int main(){int t,i,j;cin>>t;while(t--){scanf("%d",&c); for(i=0;i<c;i++) { scanf("%d%d%lf%lf%lf",&station[i].num,&station[i].power,&station[i].x,&station[i].y,&station[i].z); } for(i=0;i<c;i++) { scanf("%d%d%lf%lf%lf",&receive[i].num,&receive[i].power,&receive[i].x,&receive[i].y,&receive[i].z); }calculaterank(manrank,station,receive,womenrank);memset(manstart,0,sizeof(manstart));for(i=0;i<c;i++){manmatch[i]=-1;womensingle[i]=-1;}for(i=0;i<c;i++) //初始化,每个男生选择自己名单上的第一个喜欢的女生{onceGS(i);}while(manstack.size()!=0){int manpos=manstack.top();manstack.pop();onceGS(manpos);}for(i=0;i<c;i++){printf("%d %d\n",station[womensingle[i]].num,receive[i].num);}}return 0;}
阅读全文
0 0
- hdu 1435 Stable Match (稳定匹配)
- HDOJ 1435 Stable Match(稳定匹配)
- HDU 1435 Stable Match 稳定婚姻
- HDU 1435 Stable Match(稳定婚姻问题)
- HDU 1435 Stable Match(稳定婚姻问题|盖尔沙普利算法)
- HDU 1435 Stable Match
- 稳定匹配问题Stable Match Problem -- 稳定婚姻问题 Stable Marriage Problem
- Stable Matching稳定匹配
- HDU 1522 Marriage is Stable 稳定婚姻匹配
- 【稳定婚姻问题】【HDU1435】【Stable Match】
- 稳定婚姻问题 Poj 3487 The Stable Marriage Problem + Hdu 1522 Marriage is Stable (二分图稳定匹配)
- HDOJ 1435 Stable Match
- 【稳定匹配】:poj3487,The Stable Marriage Problem
- Stable Matching Problem稳定匹配问题-----稳定婚姻算法
- Stable Matching Problem稳定匹配问题-----稳定婚姻算法
- 稳定婚姻匹配问题 EOJ 162 The Stable Marriage Problem
- HDOJ 1914 The Stable Marriage Problem (稳定匹配)
- Marriage is Stable (稳定婚姻匹配GS算法)
- Android Tinker的两种接入方式
- 磁盘I/O性能优化--磁盘阵列
- ThinkPHP5 行为和钩子
- MySQL基础学习
- JDBC模板
- hdu 1435 Stable Match (稳定匹配)
- 解决SSH登陆一段时间就断开
- 3.9—字符串—Valid Number
- Web前端面试必会内容
- hdu 6073 Matching In Multiplication [dfs]
- JDBC存储过程、批处理、事务
- centos下nodejs的安装和升级
- [转]WebLogic10.3.6的远程调试设置及修改远程调试端口
- Unicode编码表:国际统一编码