由于涉及到实数,一定,一定不能直接等于,一定,一定加一个误差<0.00001,坑死了……

有两种事物,不难想到用二分图。这里涉及到一个有趣的问题,这个二分图的完美匹配的最小权值和就是答案。为啥呢?因为如果有四个点,a,b,c,d 。Ab和cd交叉,ac和bd不交叉,那么ac和bd的长度和一定小于ab和cd的长度和,可以画一个图很容易就证出来。所以,如果所有的边都不交叉,又因为有解,那么最小的权值和就是解了。附图一枚,自己画的,比较简陋,凑活着看吧……

用KM算法求最佳完美匹配最小权值和,可以直接把所有的权值转成负值,在求最大权值和,但是这种方法我觉得有些不对劲,但是不知道在哪里= =,上网一查,才发现这种方法只能用于x和y数量相同的时候,正统做法应该是用一个很大的数减去每个权值,再求最大权值和。PS:我用的是取反的方法……

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #define N 110
  6. struct sss
  7. {
  8. int x,y;
  9. }white[N],black[N];
  10. int n,vx[N],vy[N],fa[N];
  11. double w[N][N],px[N],py[N],str[N];
  12. double dis(int i,int j)
  13. {
  14. return sqrt((double)(black[i].x-white[j].x)*(black[i].x-white[j].x)+(double)(black[i].y-white[j].y)*(black[i].y-white[j].y));
  15. }
  16. int find(int now)
  17. {
  18. int i,j,k;
  19. if (now==)
  20. return ;
  21. vx[now]=;
  22. for (i=;i<=n;i++)
  23. {
  24. if (!vy[i]&&fabs(px[now]+py[i]-w[now][i])<0.00001)
  25. {
  26. vy[i]=;
  27. if (fa[i]==||find(fa[i]))
  28. {
  29. fa[i]=now;
  30. return ;
  31. }
  32. }
  33. else
  34. if (str[i]>px[now]+py[i]-w[now][i])
  35. str[i]=px[now]+py[i]-w[now][i];
  36. }
  37. return ;
  38. }
  39. void KM()
  40. {
  41. int i,j,k,x,y,z;
  42. double na;
  43. memset(fa,,sizeof(fa));
  44. for (i=;i<=n;i++)
  45. {
  46. memset(str,0x7f,sizeof(str));
  47. while ()
  48. {
  49. memset(vx,,sizeof(vx));
  50. memset(vy,,sizeof(vy));
  51. if (find(i))
  52. break;
  53. na=0x7f;
  54. for (j=;j<=n;j++)
  55. if (!vy[j]&&na>str[j])
  56. na=str[j];
  57. for (j=;j<=n;j++)
  58. {
  59. if (vx[j])
  60. px[j]-=na;
  61. if (vy[j])
  62. py[j]+=na;
  63. else
  64. str[j]-=na;
  65. }
  66. }
  67. }
  68. }
  69. int main()
  70. {
  71. int i,j,k,x,y,z;
  72. z=;
  73. while(scanf("%d",&n)!=EOF)
  74. {
  75. if (z)
  76. printf("\n");
  77. else
  78. z=;
  79. for (i=;i<=n;i++)
  80. px[i]=-;
  81. memset(py,,sizeof(py));
  82. for (i=;i<=n;i++)
  83. scanf("%d%d",&white[i].x,&white[i].y);
  84. for (i=;i<=n;i++)
  85. scanf("%d%d",&black[i].x,&black[i].y);
  86. for (i=;i<=n;i++)
  87. for (j=;j<=n;j++)
  88. {
  89. w[i][j]=-dis(i,j);
  90. if (px[i]<w[i][j])
  91. px[i]=w[i][j];
  92. }
  93. KM();
  94. for (i=;i<=n;i++)
  95. printf("%d\n",fa[i]);
  96. }
  97. }

poj 3565 uva 1411 Ants KM算法求最小权的更多相关文章

  1. poj3565 Ants km算法求最小权完美匹配,浮点权值

    /** 题目:poj3565 Ants km算法求最小权完美匹配,浮点权值. 链接:http://poj.org/problem?id=3565 题意:给定n个白点的二维坐标,n个黑点的二维坐标. 求 ...

  2. 【POJ 2195】 Going Home(KM算法求最小权匹配)

    [POJ 2195] Going Home(KM算法求最小权匹配) Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  3. hdu1533 Going Home km算法解决最小权完美匹配

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  4. POJ-2195 Going Home---KM算法求最小权值匹配(存负边)

    题目链接: https://vjudge.net/problem/POJ-2195 题目大意: 给定一个N*M的地图,地图上有若干个man和house,且man与house的数量一致.man每移动一格 ...

  5. poj - 3686 The Windy's (KM算法)

    题意:n个订单和m个生产车间,每个订单在不同的车间生产所需要的时间不一样,并且每个订单只能在同一个车间中完成,直到这个车间完成这个订单就可以生产下一个订单.现在需要求完成n个订单的平均时间最少是多少. ...

  6. uva 1411 Ants (权值和最小的完美匹配---KM算法)

    uva 1411 Ants Description Young naturalist Bill studies ants in school. His ants feed on plant-louse ...

  7. UVA 1411 - Ants(二分图完美匹配)

    UVA 1411 - Ants 题目链接 题意:给定一些黑点白点,要求一个黑点连接一个白点,而且全部线段都不相交 思路:二分图完美匹配,权值存负的欧几里得距离,这种话,相交肯定比不相交权值小,所以做一 ...

  8. 训练指南 UVA - 11383(KM算法的应用 lx+ly >=w(x,y))

    layout: post title: 训练指南 UVA - 11383(KM算法的应用 lx+ly >=w(x,y)) author: "luowentaoaa" cata ...

  9. 【POJ 2400】 Supervisor, Supervisee(KM求最小权匹配)

    [POJ 2400] Supervisor, Supervisee(KM求最小权匹配) Supervisor, Supervisee Time Limit: 1000MS   Memory Limit ...

随机推荐

  1. 多线程操作Coredata(转)

    第一步:搭建 Core Data 多线程环境这个问题首先要解决的是搭建 Core Data 多线程环境.Core Data 对并发模式的支持非常完备,NSManagedObjectContext 的指 ...

  2. cocos2d-x 基本数学

    转自:http://cjhworld.blog.163.com/blog/static/207078036201331510141222/ 数学函数: ccp(x, y); // 以坐标x,y创建一个 ...

  3. BZOJ 2049: [Sdoi2008]Cave 洞穴勘测 LCT

    2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnli ...

  4. Ubuntu下安装Nginx,PHP5(及PHP-FPM),MySQL

    .简介: Tomcat在高并发环境下处理动态请求时性能很低,而在处理静态页面更加脆弱.虽然Tomcat的最新版本支持epoll,但是通过Nginx来处理静态页面要比通过Tomcat处理在性能方面好很多 ...

  5. UVA - 10883 Supermean

    Description Problem F Supermean Time Limit: 2 second "I have not failed. I've just found 10,000 ...

  6. 【Android动画】之Tween动画 (渐变、缩放、位移、旋转)

    Android 平台提供了两类动画. 一类是Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转.平移.放缩和渐变). 第二类就是 Frame动画,即顺序的播放事先做好的图像,与g ...

  7. 同时使用ADO与Excel类库冲突的问题

    客户需要一个Demo程序实现Access数据库表导出到Excel表格,并将表中存储的照片(OLE对象)以其中一个字段(编号)命名存储到本地.程序中引入了ADO操作Access数据库("C:\ ...

  8. Centos内核升级的三种方法

    本文出自 “存储之厨” 博客,请务必保留此出处http://xiamachao.blog.51cto.com/10580956/1755354 在基于CentOS平台的工作过程中,难免有时需要升级或者 ...

  9. js整理常用方法

    javascript对象合并或追加属性的方法 function objMerger(obj1, obj2){ for(var r in obj2){ //eval("obj1."+ ...

  10. 基于cocos2d-x的游戏框架设计——李成

    视频:http://v.youku.com/v_show/id_XMzc5ODUyMTI4.html?f=17330006 网易科技讯 3月31日,第四届CocoaChina开发者大会暨Cocos2d ...