http://poj.org/problem?id=2400

KM算法http://philoscience.iteye.com/blog/1754498

题意:每个雇主对雇员有个满意度 雇员对雇主有个满意度 求最匹配的雇员与雇主

最小权匹配 这个给出的数据矩阵貌似是反着的 建图的时候反一下就好了

  1. #include <iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. #include<stdlib.h>
  7. #define N 110
  8. #define INF 0x3f3f3f
  9. using namespace std;
  10. int w[N][N],n,x[N],y[N],lx[N],ly[N],link[N],sum,o[N],vis[N],num;
  11. bool match(int u)
  12. {
  13. x[u] = ;
  14. for(int i = ; i <= n ; i++)
  15. if(lx[u]+ly[i]==w[u][i]&&!y[i])
  16. {
  17. y[i] = ;
  18. if(!link[i]||match(link[i]))
  19. {
  20. link[i] = u;
  21. return true;
  22. }
  23. }
  24. return false;
  25. }
  26. double km()
  27. {
  28. int i,j,g;
  29. for(i = ; i <= n ; i++)
  30. link[i] = lx[i] = ly[i]=;
  31. for(i = ; i <= n ; i++)
  32. {
  33. for(;;)
  34. {
  35. for(j = ;j <= n ; j++)
  36. x[j] = y[j] = ;
  37. if(match(i)) break;
  38. int d = INF;
  39. for(j = ; j <= n ; j++)
  40. {
  41. if(x[j])
  42. for(g = ; g <= n ; g++)
  43. if(!y[g])
  44. d = min(d,lx[j]+ly[g]-w[j][g]);
  45. }
  46. for(j = ; j <= n ; j++)
  47. {
  48. if(x[j]) lx[j]-=d;
  49. if(y[j]) ly[j]+=d;
  50. }
  51. }
  52. }
  53. sum=;
  54. for(i = ; i <= n ; i++)
  55. sum-=(lx[i]+ly[i]);
  56. return 1.0*sum/(*n);
  57. }
  58. void dfs(int u,int ss)
  59. {
  60. int i;
  61. if(ss>sum) return ;
  62. if(u==n+)
  63. {
  64. printf("Best Pairing %d\n",++num);
  65. for(i = ;i <= n ; i++)
  66. printf("Supervisor %d with Employee %d\n",i,o[i]);
  67. return ;
  68. }
  69. for(i = ; i <= n ; i++)
  70. {
  71. if(!vis[i])
  72. {
  73. vis[i] = ;
  74. o[u] = i;
  75. dfs(u+,ss-w[u][i]);
  76. vis[i] = ;
  77. }
  78. }
  79. }
  80. int main()
  81. {
  82. int i,j,kk=,cas,a;
  83. scanf("%d",&cas);
  84. while(cas--)
  85. {
  86. kk++;num=;
  87. scanf("%d",&n);
  88. memset(w,,sizeof(w));
  89. memset(vis,,sizeof(vis));
  90. for(i = ; i <= n ; i++)
  91. for(j = ; j <= n ; j++)
  92. {
  93. scanf("%d",&a);
  94. w[a][i] -= j;
  95. }
  96. for(i = ; i <= n ; i++)
  97. for(j = ; j <= n ; j++)
  98. {
  99. scanf("%d",&a);
  100. w[i][a]-=j;
  101. }
  102. double s = km();
  103. printf("Data Set %d, Best average difference: %.6f\n",kk,s-);
  104. dfs(,);
  105. puts("");
  106. }
  107. return ;
  108. }

poj2400Supervisor, Supervisee(KM)的更多相关文章

  1. poj图论解题报告索引

    最短路径: poj1125 - Stockbroker Grapevine(多源最短路径,floyd) poj1502 - MPI Maelstrom(单源最短路径,dijkstra,bellman- ...

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

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

  3. POJ 2400 Supervisor, Supervisee(KM)

    題目鏈接 題意 :N个部门和N个员工,每个部门要雇佣一个工人,部门对每个工人打分,从1~N,1表示很想要,N表示特别不想要,每个工人对部门打分,从1~N.1表示很想去这个部门,N表示特别不想去这个部门 ...

  4. POJ 2400 Supervisor, Supervisee(KM二分图最大权值匹配)题解

    题意:n个老板n个员工,先给你n*n的数据,i行j列代表第i个老板第j喜欢的员工是谁,再给你n*n的数据,i行j列代表第i个员工第j喜欢的老板是谁,如果匹配到第k喜欢的人就会产生一个分数k-1.现在让 ...

  5. 【转】KM匹配题集

    转自:http://blog.csdn.net/shahdza/article/details/7779324 [HDU]2255 奔小康赚大钱 模板题★1533 Going Home 模板题★242 ...

  6. 匈牙利算法与KM算法

    匈牙利算法 var i,j,k,l,n,m,v,mm,ans:longint; a:..,..]of longint; p,f:..]of longint; function xyl(x,y:long ...

  7. 【HDU2255】奔小康赚大钱-KM算法

    Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description ...

  8. HDU2255-奔小康赚大钱-二分图最大权值匹配-KM算法

    二分图最大权值匹配问题.用KM算法. 最小权值的时候把权值设置成相反数 /*-------------------------------------------------------------- ...

  9. KM模板

    var n,m,i,j:longint; ans:int64; sel,lx,ly,slack:..] of int64; a:..,..] of int64; visx,visy:..] of bo ...

随机推荐

  1. php入门变量之字符串

    字符串只是一块用引号括起来的字符:字母.数字.空格.标点符号,等等. 下面列出的全都是字符串: 'Huige' "In watermelon sugar" '100' 'Augus ...

  2. java环境搭建的问题

    本人用eclipse开发,首先在java官网中下载最新版本的jdk,jdk的版本一定要与eclipse版本位数相同,否则会提示错误“Java was started but returned exit ...

  3. Kinetic使用注意点--collection

    new Collection() 扩展了数组,主要用于配合new Container().get()使用 方法: each(func):遍历数组,执行回调函数.回调函数接收两个值,节点和索引. toA ...

  4. Java中的异常处理(二)

    1.finally package second; public class C { public static void main(String[] args){ String name = nul ...

  5. 【css】web标准

    网页主要由三部分组成:结构(Structure).表现(Presentation)和行为(Behavior) 结构重点理解: XHTML 1.应用形式 ccs+div  2000 2.基于xml 和x ...

  6. easy ui datagrid在没有数据时显示相关提示内容

    $(function () { $('#dg').datagrid({ fitColumns: true, url: 'product.json', pagination: true, pageSiz ...

  7. python学习笔记10(函数一): 函数使用、调用、返回值

    一.函数的定义 在某些编程语言当中,函数声明和函数定义是区分开的(在这些编程语言当中函数声明和函数定义可以出现在不同的文件中,比如C语言),但是在Python中,函数声明和函数定义是视为一体的.在Py ...

  8. submit和button提交表单的区别

    <html> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...

  9. replace()替换文字扑获组做法

    var txt = "12312131283", str = txt.replace(/(12(.3))/g,"中文$2");//$1是针对前面的扑获组()的如 ...

  10. Matlab中bsxfun和unique函数解析

    一.问题来源 来自于一份LSH代码,记录下来. 二.函数解析 2.1 bsxfun bsxfun是一个matlab自版本R2007a来就提供的一个函数,作用是”applies an element-b ...