题意:


Stable Match

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苦思冥想也没什么进展,希望你能帮他解决这个难题.

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
  1.  
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

Sample Output
  1.  
3 1
1 2
2 3


思路:

      稳定婚姻问题,先说明下,这个题目虽然是中文的,读了好几遍才读懂,还有就是题目没有叙述全吧,就是应该加上 如果接受者面临两个距离一样的发射者,那么他要选择权值权值大的发射者,这个没说,整的我以为发射者的权值没用呢,后来排序的时候发现会有问题,自己加上去的,还有就是这个题目不存在 Impossible 的情况,因为稳定婚姻问题肯定有解的,然后就是细微的地方,去处理每个接受者在发射者心中的地位,和每个发射者在接受者心中的地位,然后就是稳定婚姻问题了,下面我粘贴下我刚刚写好的自己对稳定婚姻的理解,本题用到的算法较容易实现,所以我的是我自己手写的,看着不舒服的可以去网上找找正规模板啥的。

稳定婚姻问题就是给你n个男的,n个女的,然后给你每个男生中女生的排名,和女生心目中男生的排名,然后让你匹配成n对,使婚姻稳定,假如a和b匹配,c和d匹配,如果a认为d比b好,同时d也认为a比c好,那么ad就有可能私奔,这样就导致了婚姻的不稳定,稳定婚姻就是找到一种解决方案让婚姻稳定

算法:

      稳定婚姻的解决方法比较简单,通俗易懂,而且还容易实现,具体有没有固定的模板我不知道,没有去找,自己模拟的,在求解的过程中,我们先把所有的男生都加到队列里,队列里的就表示当前还单身的男生,每次从队列里拿出一个男生,然后从她最喜欢的女生开始匹配,如果当前的女生尝试追求过,那么就不用追求了,如果当前的女生没有伴侣,那么可以直接匹配上,如果有伴侣,那么就看看当前这个男生和女生之前的伴侣在那个女生中更喜欢谁,如果更喜欢当先的这个男生,那么当前男生就和这个女生匹配,女生之前匹配过的直接变成单身,被扔回队列,否则,继续找下一个女生,知道找到一个能匹配上的为止,就这样一直到队列空的时候,就已经全部匹配完成了。

正确性:

        对于男生来说,每次都是从最喜欢的女生开始匹配的,遇到的第一个没人能抢走的并且稳定的就是自己最终伴侣,也就是说如果之前追求过的女生被别人抢走了,那么他将永远抢不会来,因为对于女生来说,第一次被男士按照自己的意愿选择之后,每次变更匹配对象都是在自己心目中更加喜欢的,所以一旦他放弃了某个男生,那么那个男生就没希望在和他匹配,这样男生是从最优的选的,保证男生不会出轨,女生每次都是在选择她的男生中选择最优的,这样也保证了女生最后没有怨言,这样的话,最后的到的婚姻就是稳定的,至于稳定婚姻,肯定会有稳定方案,这个我暂时证明不了.<1962年,美国数学家
David Gale 和 Lloyd Shapley是这两个人发明的方法,并且证明了稳定婚姻一定会有解>。


  1. #include<queue>
  2. #include<math.h>
  3. #include<stdio.h>
  4. #include<string.h>
  5. #include<algorithm>
  6.  
  7. #define N 200 + 5

  8. using namespace std;
  9. typedef struct
  10. {
  11. int num ,v;
  12. double x ,y ,z;
  13. }NODE;
  14. typedef struct
  15. {
  16. double dis;
  17. int v ,id;
  18. }ZT;
  19.  
  20. NODE node1[N] ,node2[N];
  21. ZT zt[N];
  22. int map[N][N] ,G_b[N][N];
  23. int nowb[N] ,nowg[N];
  24. int mark[N][N];
  25. bool camp(ZT a ,ZT b)
  26. {
  27. return a.dis < b.dis || a.dis == b.dis && a.v > b.v;
  28. }
  29. void Marr(int n)
  30. {
  31. queue<int>q;
  32. for(int i = 1 ;i <= n ;i ++)
  33. q.push(i);
  34. memset(mark ,0 ,sizeof(mark));
  35. memset(nowb ,255 ,sizeof(nowb));
  36. memset(nowg ,255 ,sizeof(nowg));
  37. while(!q.empty())
  38. {
  39. int xin ,tou = q.front();
  40. q.pop();
  41. for(int i = 1 ;i <= n ;i ++)
  42. {
  43. xin = map[tou][i];
  44. if(mark[tou][xin]) continue;
  45. mark[tou][xin] = 1;
  46. if(nowg[xin] == -1)
  47. {
  48. nowg[xin] = tou;
  49. nowb[tou] = xin;
  50. break;
  51. }
  52. else
  53. {
  54. if(G_b[xin][tou] > G_b[xin][nowg[xin]])
  55. {
  56. q.push(nowg[xin]);
  57. nowg[xin] = tou;
  58. nowb[tou] = xin;
  59. break;
  60. }
  61. }
  62. }
  63. }
  64. return;
  65. }
  66. double get_dis(NODE a ,NODE b)
  67. {
  68. double xx = (a.x - b.x) * (a.x - b.x);
  69. double yy = (a.y - b.y) * (a.y - b.y);
  70. double zz = (a.z - b.z) * (a.z - b.z);
  71. return xx + yy + zz;
  72. }
  73. int main ()
  74. {
  75. int t ,n ,i ,j;
  76. scanf("%d" ,&t);
  77. while(t--)
  78. {
  79. scanf("%d" ,&n);
  80. for(i = 1 ;i <= n ;i ++)
  81. scanf("%d %d %lf %lf %lf" ,&node1[i].num ,&node1[i].v ,&node1[i].x ,&node1[i].y ,&node1[i].z);
  82. for(i = 1 ;i <= n ;i ++)
  83. scanf("%d %d %lf %lf %lf" ,&node2[i].num ,&node2[i].v ,&node2[i].x ,&node2[i].y ,&node2[i].z);
  84. for(i = 1 ;i <= n ;i ++)
  85. {
  86. for(j = 1 ;j <= n ;j ++)
  87. {
  88. zt[j].dis = get_dis(node1[i] ,node2[j]);
  89. zt[j].v = node2[j].v;
  90. zt[j].id = j;
  91. }
  92. sort(zt + 1 ,zt + n + 1 ,camp);
  93. for(j = 1 ;j <= n ;j ++)
  94. map[i][j] = zt[j].id;
  95. }
  96. for(i = 1 ;i <= n ;i ++)
  97. {
  98. for(j = 1 ;j <= n ;j ++)
  99. {
  100. zt[j].dis = get_dis(node2[i] ,node1[j]);
  101. zt[j].v = node1[j].v;
  102. zt[j].id = j;
  103. }
  104. sort(zt + 1 ,zt + n + 1 ,camp);
  105. for(j = 1 ;j <= n ;j ++)
  106. G_b[i][zt[j].id] = n - j + 1;
  107. }
  108. Marr(n);
  109. for(i = 1 ;i <= n ;i ++)
  110. printf("%d %d\n" ,node1[i].num ,node2[nowb[i]].num);
  111. puts("");
  112. }
  113. return 0;
  114. }





hdu1435 稳定婚姻问题的更多相关文章

  1. 【稳定婚姻问题】【HDU1435】【Stable Match】

    2015/7/1 19:48 题意:给一个带权二分图  求稳定匹配 稳定的意义是对于某2个匹配,比如,( a ---- 1) ,(b----2) , 如果 (a,2)<(a,1) 且(2,a)& ...

  2. 【HDU1914 The Stable Marriage Problem】稳定婚姻问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1914 题目大意:问题大概是这样:有一个社团里有n个女生和n个男生,每位女生按照她的偏爱程度将男生排序, ...

  3. UVA 1175 Ladies' Choice 稳定婚姻问题

    题目链接: 题目 Ladies' Choice Time Limit: 6000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu 问题 ...

  4. BZOJ2140: 稳定婚姻

    题解: 题意就是求二分图的必须边. 我们有结论: 在残量网络上跑tarjan,对于一条边(u,v) 如果该边满流||scc[u]==scc[v],那么该边是可行边. 因为如果scc[u]==scc[v ...

  5. 【POJ 3487】 The Stable Marriage Problem (稳定婚姻问题)

    The Stable Marriage Problem   Description The stable marriage problem consists of matching members o ...

  6. 【UVAlive 3989】 Ladies' Choice (稳定婚姻问题)

    Ladies' Choice Teenagers from the local high school have asked you to help them with the organizatio ...

  7. poj 3487 稳定婚姻

    /** 稳定婚姻:男生不停的求婚,女生不停地拒绝 **/ #include <iostream> #include <queue> #include <cstdio> ...

  8. 稳定婚姻问题和Gale-Shapley算法(转)

    什么是算法?每当有人问作者这样的问题时,他总会引用这个例子:假如你是一个媒人,有若干个单身男子登门求助,还有同样多的单身女子也前来征婚.如果你已经知道这些女孩儿在每个男孩儿心目中的排名,以及男孩儿们在 ...

  9. 【BZOJ3816】【清华集训2014】矩阵变换 稳定婚姻问题

    题目描述 给出一个\(n\)行\(m\)列的矩阵\(A\), 保证满足以下性质: 1.\(m>n\). 2.矩阵中每个数都是\([0,n]\)中的自然数. 3.每行中,\([1,n]\)中每个自 ...

随机推荐

  1. HDOJ-6645(简单题+贪心+树)

    Stay Real HDOJ-6645 由小根堆的性质可以知道,当前最大的值就在叶节点上面,所以只需要排序后依次取就可以了. #include<iostream> #include< ...

  2. C#类中的字段、属性和方法

    C#类中的字段.属性和方法 刚开始学C#,对于类中的字段.属性和方法很难分清,写下这份笔记,帮助理解 字段:与类相关的变量 声明方法与声明变量类似,可在前面添加访问修饰符.static关键字等: 属性 ...

  3. 单元测试 - SpringBoot2+Mockito实战

    单元测试 - SpringBoot2+Mockito实战 在真实的开发中,我们通常是使用SpringBoot的,目前SpringBoot是v2.4.x的版本(SpringBoot 2.2.2.RELE ...

  4. web实现时钟效果

    纯原生开发时钟效果,话不多说直接上代码. HTML标签部分 <div class="cricles">         <div class="poin ...

  5. java 实现快速排序

    package leetcode;public class Singleton { public static void sort(int[] array,int low,int high){ int ...

  6. Nodejs学习笔记(1) Nodejs安装+借助express模块简单部署服务器

    1 安装 1.1 下载和安装 1.2 什么是REPL?如何使用? 1.3 npm对单一模块的安装和删除功能 1.4 通过package.json自定义模块(安装模块) 1.5 设置全局目录 2 部署网 ...

  7. salesforce lightning零基础学习(十七) 实现上传 Excel解析其内容

    本篇参考: https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader https://github.com/SheetJS/sheetjs ...

  8. HTML的基础语法

    区别于c语言这类高级语言,HTML不是编程语言,而好似一种描述型语言,用于描述网页中内容的显示方式. HTML标记以<>来进行标记.HTML中的标记按其是否成对出现,可以分为单标记和双标记 ...

  9. C#无边框窗体拖动代码

    1.重写 protected override void WndProc(ref Message m) { if (m.Msg == 163 && this.ClientRectang ...

  10. java常用算法笔记

    1.将一个10进制的c转换为n进制 String s=new BigInteger(c+"",10).toString(n); 2. 求一个解退出 System.exit(0): ...