http://acm.hdu.edu.cn/showproblem.php?pid=2853

这道题初看了没有思路,一直想的用网络流如何解决

参考了潘大神牌题解才懂的

最大匹配问题KM

还需要一些技巧来解决最小变动,

做法是:把原先的邻接矩阵每个数扩大k倍(k>n)

为了突出原先的选择,也就是同等情况下优先选择原来的方案

给原来的方案对应矩阵内的数据+1

那么

最终得出的最大匹配值/k=真实的最大匹配

最终得出的最大匹配值%k=原来的方案采用了几个

这里的KM留下来做模板

/*
二分图最佳匹配 (kuhn munkras 算法 O(m*m*n)).
邻接矩阵形式 。 返回最佳匹配值,传入二分图大小m,n
邻接矩阵 mat ,表示权,match1,match2返回一个最佳匹配,为匹配顶点的match值为-1,
一定注意m<=n,否则循环无法终止,最小权匹配可将全职取相反数。
初始化: for(i=0;i<MAXN;i++)
for(j=0;j<MAXN;j++) mat[i][j]=-inf;
对于存在的边:mat[i][j]=val;//注意不能负值
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 55
#define inf 1000000000
#define _clr(x) memset(x,-1,sizeof(int)*maxn)
using namespace std;
int donser[maxn][maxn];
int match1[maxn],match2[maxn];
int km(int m,int n,int mat[][maxn],int *match1,int *match2)
{
int s[maxn],t[maxn],ak[maxn],ac[maxn];
int p,q,i,j,k,ret=;
for(i=;i<m;i++)
{
ak[i]=-inf;
for(j=;j<n;j++)
ak[i]=mat[i][j]>ak[i]?mat[i][j]:ak[i];
if(ak[i]==-inf) return -;
}
for(i=;i<n;i++)
ac[i]=;
_clr(match1);
_clr(match2);
for(i=;i<m;i++)
{
_clr(t);
p=;q=;
for(s[]=i;p<=q&&match1[i]<;p++)
{
for(k=s[p],j=;j<n&&match1[i]<;j++)
{
if(ak[k]+ac[j]==mat[k][j]&&t[j]<)
{
s[++q]=match2[j];
t[j]=k;
if(s[q]<)
{
for(p=j;p>=;j=p)
{
match2[j]=k=t[j];
p=match1[k];
match1[k]=j;
}
}
}
}
}
if(match1[i]<)
{
i--;
p=inf;
for(k=;k<=q;k++)
{
for(j=;j<n;j++)
{
if(t[j]<&&ak[s[k]]+ac[j]-mat[s[k]][j]<p)
p=ak[s[k]]+ac[j]-mat[s[k]][j];
}
}
for(j=;j<n;j++)
ac[j]+=t[j]<?:p;
for(k=;k<=q;k++)
ak[s[k]]-=p;
}
}
for(i=;i<m;i++)
ret+=mat[i][match1[i]];
return ret;
}
int main()
{
int n,m,i,j;
while(~scanf("%d%d",&n,&m))
{
int k=n+,t,num=;
for(i=;i<n;i++)
{
for(j=;j<m;j++)
{
scanf("%d",&t);
donser[i][j]=t*k;
}
}
for(i=;i<n;i++)
{
scanf("%d",&t);
//cout<<i<<" "<<t-1<<" "<<donser[i][t-1]<<endl;
num+=donser[i][t-]/k;
donser[i][t-]+=;
}
int kk=km(n,m,donser,match1,match2);
cout<<n-kk%k<<" "<<kk/k-num<<endl;
memset(donser,,sizeof(donser));
}
return ;
}

HDU 2853 最大匹配&KM模板的更多相关文章

  1. HDU 2853 & 剩余系+KM模板

    题意: 给你一张二分图,给一个原匹配,求原匹配改动最少的边数使其边权和最大. SOL: 我觉得我的智商还是去搞搞文化课吧..这种题给我独立做我大概只能在暴力优化上下功夫.. 这题的处理方法让我想到了剩 ...

  2. 【HDU 2853】 KM算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 题意:有n个公司,m个任务,每个公司做每个任务都有一个效率值,最开始每个公司都指派了一个任务,现 ...

  3. hdu 2853 Assignment KM算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 Last year a terrible earthquake attacked Sichuan ...

  4. HDU 2853 Assignment(KM最大匹配好题)

    HDU 2853 Assignment 题目链接 题意:如今有N个部队和M个任务(M>=N),每一个部队完毕每一个任务有一点的效率,效率越高越好.可是部队已经安排了一定的计划,这时须要我们尽量用 ...

  5. 【HDU 2853】Assignment (KM)

    Assignment Problem Description Last year a terrible earthquake attacked Sichuan province. About 300, ...

  6. Assignment HDU - 2853(二分图匹配 KM 新边旧边)

    传送门: Assignment HDU - 2853 题意:题意直接那松神的题意了.给了你n个公司和m个任务,然后给你了每个公司处理每个任务的效率.然后他已经给你了每个公司的分配方案,让你求出最多能增 ...

  7. 带权二分图最大匹配KM算法

    二分图的判定 如果一个图是连通的,可以用如下的染色法判定是否二分图: 我们把X部的结点颜色设为0,Y部的颜色设为1. 从某个未染色的结点u开始,做BFS或者DFS .把u染为0,枚举u的儿子v.如果v ...

  8. HDU 2853 (KM最大匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 题目大意:二分图匹配费用流.①最大匹配②最小原配变动 解题思路: 如果去掉第二个要求,那么就是裸 ...

  9. HDU 2255 & KM模板

    题意: 一张完备二分图求最优完备匹配. SOL: 这题就不讲什么sol了...毕竟是裸的KM,不会的话可以看老人家的大白鼠,一些问题看代码注释.讲讲经历(悲惨的经历) 刚打完,自信地交上去发现MLE. ...

随机推荐

  1. Spring事务传播简介

    一.事务传播属性(propagation) 1.REQUIRED,默认属性 此级别下,会为每一个调用的方法创建一个逻辑事务域,如果前面的方法已经创建了事务,那么后面的方法支持当前事务,如果当前没有事务 ...

  2. 安装ubuntu和安装ubuntu后要安装的软件列表

    安装ubuntu 老毛桃进入win pe修复启动项 在win pe下面制作ubuntu的安装盘,只用的软件是ultraISO 参考博客下面的分区的那篇文章  http://jingyan.baidu. ...

  3. C语言进行面向对象编程

    http://blog.csdn.net/dadalan/article/details/3983888 http://blog.163.com/zhqh43@126/blog/static/4043 ...

  4. js 连接地址分析

    html的连接地址 <a href="/yzh/mobile/index.php?m=default&c=user&a=order_list&cla=dfk&q ...

  5. 解决并发情况下库存减为负数问题--update2016.04.24

    场景: 一个商品有库存,下单时先检查库存,如果>0,把库存-1然后下单,如果<=0,则不能下单,事务包含两条sql语句: ; update products ) WHERE id=; 在并 ...

  6. Mongodb的Samus驱动

    最近开始学习Mongodb方面的东西.. 看到有很多博主都说MongoDB的第三方驱动 Samus 对Linq的支持比较好..能够降低学习的成本..所以就想从这里开始.. 但是弊端在我学习了一半的时候 ...

  7. CentOS7 mono环境连接WCF

    总结下在mono环境中使用Wcf出现的问题以帮助你快速解决问题. 1.昨天在内网Centos7下部署由Windows上开发完成的ASP.NET Mvc4项目,部署到mono环境下遇到了无法找到endp ...

  8. 清除SQL server2008 记住的用户名和密码

    删除以下文件即可: C:\Users\%username%\AppData\Roaming\Microsoft\Microsoft SQL Server\100\Tools\Shell\SqlStud ...

  9. Xcode常用技巧(2)-使Xcode在创建类时自动添加前缀

    在Xcode5之前的版本中,Xcode在新建项目时,会要求为一个类指定一个前缀,这样方便我们区分相同名字的类.而从Xcode6开始,由于Swift增加了命名空间的关系,Xcode在新建项目时,不会再要 ...

  10. linux的多媒体 播放 软件版权问题

    linux下基本很多 跟多媒体 相关的软件, 都是有版权的, 都是 第三方软件, 都是closed-resource的 都有版权问题, 因此, 几乎所有的 linux的 发行版 都不会带有 多媒体软件 ...