题解:

二分图最大匹配

根据三角形不等式

直接上最大匹配即可

注意编圈取相反数

代码:

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cmath>
  6. using namespace std;
  7. const int N=110;
  8. const double INF=0xffffffffffff,eps=1e-6;
  9. struct Node{double x,y;}Dot1[N],Dot2[N];
  10. double Dist(Node a,Node b)
  11. {
  12. return -sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
  13. }
  14. int n,NX,NY,link[N],visx[N],visy[N];
  15. double Map[N][N],lx[N],ly[N],slack[N];
  16. int FindPath(int u)
  17. {
  18. visx[u]=1;
  19. for (int i=1;i<=NY;i++)
  20. {
  21. if (visy[i])continue;
  22. double temp=lx[u]+ly[i]-Map[u][i];
  23. if (fabs(temp)<=eps)
  24. {
  25. visy[i]=1;
  26. if (link[i]==-1||FindPath(link[i]))
  27. {
  28. link[i]=u;
  29. return 1;
  30. }
  31. }
  32. else if (slack[i]>temp)slack[i]=temp;
  33. }
  34. return 0;
  35. }
  36. void KM()
  37. {
  38. memset(lx,0,sizeof(lx));
  39. memset(ly,0,sizeof(ly));
  40. memset(link,-1,sizeof(link));
  41. for (int i=1;i<=NX;i++)
  42. for (int j=1;j<=NY;j++)
  43. if (Map[i][j]>lx[i])lx[i]=Map[i][j];
  44. for (int i=1;i<=NX;i++)
  45. {
  46. for (int j=1;j<=NY;j++)slack[j]=INF;
  47. while (1)
  48. {
  49. memset(visx,0,sizeof(visx));
  50. memset(visy,0,sizeof(visy));
  51. if (FindPath(i))break;
  52. double d=INF;
  53. for (int j=1;j<=NY;j++)
  54. if (!visy[j]&&d>slack[j])d=slack[j];
  55. for (int j=1;j<=NX;j++)
  56. if (visx[j])lx[j]-=d;
  57. for (int j=1;j<=NY;j++)
  58. {
  59. if (visy[j])ly[j]+=d;
  60. else slack[j]-=d;
  61. }
  62. }
  63. }
  64. }
  65. int main()
  66. {
  67. while (~scanf("%d",&n))
  68. {
  69. memset(Map,0,sizeof(Map));
  70. for (int i=1;i<=n;i++)scanf("%lf%lf",&Dot1[i].x,&Dot1[i].y);
  71. for (int i=1;i<=n;i++)scanf("%lf%lf",&Dot2[i].x,&Dot2[i].y);
  72. for (int i=1;i<=n;i++)
  73. for (int j=1;j<=n;j++)Map[i][j]=Dist(Dot1[i],Dot2[j]);
  74. NX=NY=n;
  75. KM();
  76. for (int i=1;i<=N;i++)
  77. for (int j=1;j<=N;j++)
  78. if (link[j]==i)
  79. {
  80. printf("%d\n",j);
  81. break;
  82. }
  83. }
  84. return 0;
  85. }

  

poj3656的更多相关文章

随机推荐

  1. Docker+.Net Core 的那些事儿-3.创建容器并运行

    1.根据镜像运行容器 上篇文章建立了一个镜像: 我们以此开始,执行以下命令: docker run -d -p 5000:5000 hwapp:latest 如果返回以上结果表示建立成功. 此时如果你 ...

  2. Hive环境安装

    说明: (Hbase依赖于Hadoop,同时需要把元数据存放在mysql中),mysql自行安装 Hadoop2.0安装参考我的博客: https://www.cnblogs.com/654wangz ...

  3. SpringBoot入门学习(二)

    第一讲我们已经讲解了入门Demo,这一讲我们主要讲解包含以下内容 项目内一些属性配置 自定义属性配置 ConfigurationProperties配置 (1)第一个工程创建的时候会自动在工程下创建a ...

  4. CSS Fonts(字体)

    CSS Fonts(字体) 一.serif和sans-serif字体之间的区别 注意: 在计算机屏幕上,sans-serif字体被认为是比serif字体容易阅读. 二.CSS字型 在CSS中,有两种类 ...

  5. Hive Shell常用操作

    1.Hive非交互模式常用命令: 1) hive -e:从命令行执行指定的HQL,不需要分号: % hive -e 'select * from dummy' > a.txt 2) hive – ...

  6. MySQL修改max_allowed_packet

    因mysql从库报错Last_IO_Error: Got a packet bigger than 'max_allowed_packet' bytes mysql> show slave st ...

  7. linxu 安装rabbitMQ

    转载自:http://blog.csdn.net/mooreliu/article/details/44645807 首先使EPEL(http://fedoraproject.org/wiki/EPE ...

  8. 爬虫之JSON案例

    糗事百科实例: 爬取糗事百科段子,假设页面的URL是 http://www.qiushibaike.com/8hr/page/1 要求: 使用requests获取页面信息,用XPath / re 做数 ...

  9. Outlook.com 系列邮箱 POP3 及 IMAP 设置方法

    支持 Exchange ActiveSync 的应用 有了 EAS,你可以立即获取电子邮件,以及在一个位置查看所有文件夹.日历和联系人. 如果你的电子邮件应用支持Exchange ActiveSync ...

  10. 24,25-request对象

    var http = require('http'); var server = http.createServer(); server.listen() console.log(server.add ...