題目鏈接

題意 :N个部门和N个员工,每个部门要雇佣一个工人,部门对每个工人打分,从1~N,1表示很想要,N表示特别不想要,每个工人对部门打分,从1~N。1表示很想去这个部门,N表示特别不想去这个部门,求一个匹配,使每个人的希望值最大。

思路 :KM算法。资料。用深搜构造所有能达到最大值的匹配情况。参考

 #include <stdio.h>
#include <string.h>
#include <iostream> using namespace std ; const int maxn = ;
int lx[maxn],ly[maxn] ;
int left[maxn], n;
bool S[maxn],T[maxn] ;
int w[maxn][maxn] ;
int slack[maxn] ;
int y[maxn],cnt ;
int ans; bool match(int x)
{
S[x] = true ;
for(int j = ; j <= n ; j++)
{
if(lx[x]+ly[j] == w[x][j] && !T[j])
{
T[j] = true ;
if(!left[j] || match(left[j]))
{
left[j] = x ;
return true ;
}
}
else slack[j] = min(slack[j],w[x][j]-lx[x]-ly[j]) ;
}
return false ;
} void KM()
{
for(int i = ; i <= n ; i++)
{
left[i] = ly[i] = ;
lx[i] = ;
for(int j = ; j <= n ; j++)
lx[i] = min(lx[i],w[i][j]) ;
}
for(int x = ; x <= n ; x++)
{
for(int i = ; i <= n ; i++)
slack[i] = ;
while()
{
memset(S,false,sizeof(S)) ;
memset(T,false,sizeof(T)) ;
if(match(x)) break ;
int tmp = ;
for(int i = ; i <= n ; i++)
if(!T[i])
tmp = min(tmp,slack[i]) ;
if(tmp == )return ;
for(int i = ; i <= n ; i++)
{
if(S[i]) lx[i] += tmp ;
if(T[i]) ly[i] -= tmp ;
}
}
}
} void dfs(int t,int sum)
{
if(sum > ans) return ;
if(t > n)
{
if(sum != ans) return ;
printf("Best Pairing %d\n",++cnt) ;
for(int j = ; j <= n ; j++)
printf("Supervisor %d with Employee %d\n",j,y[j]) ;
return ;
}
for(int i = ; i <= n ; i++)
{
if(!T[i])
{
y[t] = i ;
T[i] = true ;
dfs(t+,sum+w[t][i]) ;
T[i] = false ;
}
}
return ;
}
int main()
{
int t,x ;
scanf("%d", &t) ;
for(int k = ; k <= t ; k++)
{
for(int i = ; i <= n ; i++)
for(int j = ; j <= n ; j++)
w[i][j] = ;
scanf("%d",&n) ;
for(int i = ; i <= n ; i++)
for(int j = ; j < n ; j++)
{
scanf("%d",&x) ;
w[x][i] += j ;
}
for(int i = ; i <= n ; i++)
for(int j = ; j < n ; j++)
{
scanf("%d",&x) ;
w[i][x] += j ;
}
KM() ;
ans = ;
cnt = ;
for(int i = ; i <= n ; i++)
if(left[i])
ans += w[left[i]][i] ;
printf("Data Set %d, Best average difference: %.6f\n",k,ans/(2.0*n)) ;
memset(T,false,sizeof(T)) ;
dfs(,) ;
printf("\n") ;
}
return ;
}

POJ 2400 Supervisor, Supervisee(KM)的更多相关文章

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

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

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

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

  3. POJ 1486 Sorting Slides (KM)

    Sorting Slides Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2831   Accepted: 1076 De ...

  4. POJ 3669 Meteor Shower(流星雨)

    POJ 3669 Meteor Shower(流星雨) Time Limit: 1000MS    Memory Limit: 65536K Description 题目描述 Bessie hears ...

  5. POJ 3253 Fence Repair (优先队列)

    POJ 3253 Fence Repair (优先队列) Farmer John wants to repair a small length of the fence around the past ...

  6. 【POJ 3071】 Football(DP)

    [POJ 3071] Football(DP) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4350   Accepted ...

  7. Poj 3613 Cow Relays (图论)

    Poj 3613 Cow Relays (图论) 题目大意 给出一个无向图,T条边,给出N,S,E,求S到E经过N条边的最短路径长度 理论上讲就是给了有n条边限制的最短路 solution 最一开始想 ...

  8. POJ 1251 Jungle Roads (prim)

    D - Jungle Roads Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Su ...

  9. poj 1284 Primitive Roots (原根)

    Primitive Roots http://poj.org/problem?id=1284 Time Limit: 1000MS   Memory Limit: 10000K       Descr ...

随机推荐

  1. winform Config文件操作

    using System;using System.Collections.Generic;using System.Text;using System.Xml;using System.Config ...

  2. linux gd库不支持jpeg解决办法

    1. 查看gd库是否支持jpeg gd_info(); 2. 如果JPEG Support 不为1则不支持. 3.首先下载 libjpeg http://www.ijg.org/ ,进行安装 安装目录 ...

  3. Spannable相关方法

    实现文本链接 其中tv是TextView类型的控件.只需写java代码即可实现链接,无需在xml文件中进行其他的设置. SpannableString spanTxt = new SpannableS ...

  4. Firebird数据库相关备忘录

    Firebird数据库中有一些很特别的东西,很好用,但由于平时用的不多,记在这里,以备以后用到时查询. 1.以ADO 的OLE ODBC驱动方式访问 Firebird,可以使用如下连接串: FBCon ...

  5. DataSnap数据库连接池,数据集对象池的应用

    传统的应用服务器的开发往往是在ServerMethods单元中拖放一堆TDataSet, TDaTaSetProvider控件,这是一个最简单粗暴的开发方向,往往会造成服务端程序文件的臃肿.服务运行期 ...

  6. apache+tomcat整合

    一 .Apache与Tomcat的比较 apache支持静态页面,tomcat支持动态的,比如servlet等. 一般使用apache+tomcat的话,apache只是作为一个转发,对jsp的处理是 ...

  7. 1100. Mars Numbers (20)

    People on Mars count their numbers with base 13: Zero on Earth is called "tret" on Mars. T ...

  8. ASP.NET从数据库中取出数据,有数据的复选框为选中

    在KS系统中在更新菜单的时候,当查出菜单的时候要查出菜单下面已经有了哪些界面了我用了一下的方法弄的.代码如下: 界面代码: <%@ Page Language="C#" Au ...

  9. Jira 6.0.3 安装与破解

    如果你还没有使用Jira做项目跟踪与管理,那就赶紧试用一下吧.下面教你一步一步安装Jira 6.0.3,以及如何破解试用版. 一. 安装准备   1. 去Jira官方网站下载http://www.at ...

  10. ios系统 处理内存警告

    iPhone下每个app可用的内存是被限制的,如果一个app使用的内存超过20M,则系统会向该app发送Memory Warning消息.收到此消息后,app必须正确处理,否则可能出错或者出现内存泄露 ...