poj2400Supervisor, Supervisee(KM)
http://poj.org/problem?id=2400
KM算法http://philoscience.iteye.com/blog/1754498
题意:每个雇主对雇员有个满意度 雇员对雇主有个满意度 求最匹配的雇员与雇主
最小权匹配 这个给出的数据矩阵貌似是反着的 建图的时候反一下就好了
- #include <iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<queue>
- #include<stdlib.h>
- #define N 110
- #define INF 0x3f3f3f
- using namespace std;
- int w[N][N],n,x[N],y[N],lx[N],ly[N],link[N],sum,o[N],vis[N],num;
- bool match(int u)
- {
- x[u] = ;
- for(int i = ; i <= n ; i++)
- if(lx[u]+ly[i]==w[u][i]&&!y[i])
- {
- y[i] = ;
- if(!link[i]||match(link[i]))
- {
- link[i] = u;
- return true;
- }
- }
- return false;
- }
- double km()
- {
- int i,j,g;
- for(i = ; i <= n ; i++)
- link[i] = lx[i] = ly[i]=;
- for(i = ; i <= n ; i++)
- {
- for(;;)
- {
- for(j = ;j <= n ; j++)
- x[j] = y[j] = ;
- if(match(i)) break;
- int d = INF;
- for(j = ; j <= n ; j++)
- {
- if(x[j])
- for(g = ; g <= n ; g++)
- if(!y[g])
- d = min(d,lx[j]+ly[g]-w[j][g]);
- }
- for(j = ; j <= n ; j++)
- {
- if(x[j]) lx[j]-=d;
- if(y[j]) ly[j]+=d;
- }
- }
- }
- sum=;
- for(i = ; i <= n ; i++)
- sum-=(lx[i]+ly[i]);
- return 1.0*sum/(*n);
- }
- void dfs(int u,int ss)
- {
- int i;
- if(ss>sum) return ;
- if(u==n+)
- {
- printf("Best Pairing %d\n",++num);
- for(i = ;i <= n ; i++)
- printf("Supervisor %d with Employee %d\n",i,o[i]);
- return ;
- }
- for(i = ; i <= n ; i++)
- {
- if(!vis[i])
- {
- vis[i] = ;
- o[u] = i;
- dfs(u+,ss-w[u][i]);
- vis[i] = ;
- }
- }
- }
- int main()
- {
- int i,j,kk=,cas,a;
- scanf("%d",&cas);
- while(cas--)
- {
- kk++;num=;
- scanf("%d",&n);
- memset(w,,sizeof(w));
- memset(vis,,sizeof(vis));
- for(i = ; i <= n ; i++)
- for(j = ; j <= n ; j++)
- {
- scanf("%d",&a);
- w[a][i] -= j;
- }
- for(i = ; i <= n ; i++)
- for(j = ; j <= n ; j++)
- {
- scanf("%d",&a);
- w[i][a]-=j;
- }
- double s = km();
- printf("Data Set %d, Best average difference: %.6f\n",kk,s-);
- dfs(,);
- puts("");
- }
- return ;
- }
poj2400Supervisor, Supervisee(KM)的更多相关文章
- poj图论解题报告索引
最短路径: poj1125 - Stockbroker Grapevine(多源最短路径,floyd) poj1502 - MPI Maelstrom(单源最短路径,dijkstra,bellman- ...
- 【POJ 2400】 Supervisor, Supervisee(KM求最小权匹配)
[POJ 2400] Supervisor, Supervisee(KM求最小权匹配) Supervisor, Supervisee Time Limit: 1000MS Memory Limit ...
- POJ 2400 Supervisor, Supervisee(KM)
題目鏈接 題意 :N个部门和N个员工,每个部门要雇佣一个工人,部门对每个工人打分,从1~N,1表示很想要,N表示特别不想要,每个工人对部门打分,从1~N.1表示很想去这个部门,N表示特别不想去这个部门 ...
- POJ 2400 Supervisor, Supervisee(KM二分图最大权值匹配)题解
题意:n个老板n个员工,先给你n*n的数据,i行j列代表第i个老板第j喜欢的员工是谁,再给你n*n的数据,i行j列代表第i个员工第j喜欢的老板是谁,如果匹配到第k喜欢的人就会产生一个分数k-1.现在让 ...
- 【转】KM匹配题集
转自:http://blog.csdn.net/shahdza/article/details/7779324 [HDU]2255 奔小康赚大钱 模板题★1533 Going Home 模板题★242 ...
- 匈牙利算法与KM算法
匈牙利算法 var i,j,k,l,n,m,v,mm,ans:longint; a:..,..]of longint; p,f:..]of longint; function xyl(x,y:long ...
- 【HDU2255】奔小康赚大钱-KM算法
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description ...
- HDU2255-奔小康赚大钱-二分图最大权值匹配-KM算法
二分图最大权值匹配问题.用KM算法. 最小权值的时候把权值设置成相反数 /*-------------------------------------------------------------- ...
- KM模板
var n,m,i,j:longint; ans:int64; sel,lx,ly,slack:..] of int64; a:..,..] of int64; visx,visy:..] of bo ...
随机推荐
- php入门变量之字符串
字符串只是一块用引号括起来的字符:字母.数字.空格.标点符号,等等. 下面列出的全都是字符串: 'Huige' "In watermelon sugar" '100' 'Augus ...
- java环境搭建的问题
本人用eclipse开发,首先在java官网中下载最新版本的jdk,jdk的版本一定要与eclipse版本位数相同,否则会提示错误“Java was started but returned exit ...
- Kinetic使用注意点--collection
new Collection() 扩展了数组,主要用于配合new Container().get()使用 方法: each(func):遍历数组,执行回调函数.回调函数接收两个值,节点和索引. toA ...
- Java中的异常处理(二)
1.finally package second; public class C { public static void main(String[] args){ String name = nul ...
- 【css】web标准
网页主要由三部分组成:结构(Structure).表现(Presentation)和行为(Behavior) 结构重点理解: XHTML 1.应用形式 ccs+div 2000 2.基于xml 和x ...
- easy ui datagrid在没有数据时显示相关提示内容
$(function () { $('#dg').datagrid({ fitColumns: true, url: 'product.json', pagination: true, pageSiz ...
- python学习笔记10(函数一): 函数使用、调用、返回值
一.函数的定义 在某些编程语言当中,函数声明和函数定义是区分开的(在这些编程语言当中函数声明和函数定义可以出现在不同的文件中,比如C语言),但是在Python中,函数声明和函数定义是视为一体的.在Py ...
- submit和button提交表单的区别
<html> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...
- replace()替换文字扑获组做法
var txt = "12312131283", str = txt.replace(/(12(.3))/g,"中文$2");//$1是针对前面的扑获组()的如 ...
- Matlab中bsxfun和unique函数解析
一.问题来源 来自于一份LSH代码,记录下来. 二.函数解析 2.1 bsxfun bsxfun是一个matlab自版本R2007a来就提供的一个函数,作用是”applies an element-b ...