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. select()

    select(),确定一个或多个套接口的状态,本函数用于确定一个或多个套接口的状态,对每一个套接口,调用者可查询它的可读性.可写性及错误状态信息,用fd_set结构来表示一组等待检查的套接口,在调用返 ...

  2. Spring MVC学习笔记——POJO和DispatcherServlet

    POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称. 使用POJO名称是为了避免和EJB(Enter ...

  3. BigInteger类

    当一个数字非常大时,则肯定无法使用基本类型接受,所以使用了BigInteger类. BigInteger类表示是大整数类,定义在java.math包中,如果在操作时一个整型数据已经超过了整数的最大类型 ...

  4. HTTP Status Code [RFC]

    来源:http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml Hypertext Transfer Prot ...

  5. Python + OpenCV2 系列:3 - python 字符串,类,编码规范

    首先,强烈推荐<<简明 Python 教程>> Swaroop, C. H. 著 沈洁元 译 其实,这本书里已经把python的最基本的用法,编码等等介绍的很好,这里把我用到的 ...

  6. js返回顶部

    1. function scrollTop(){ $(},); } 2. $("#side-bar .gotop").click(function(){ $(},); //返回顶部 ...

  7. Realm简单使用小记

    一.项目环境:纯OC 载入Realm: pod 'Realm' 二.为了方便调用可以写一个Realm类的分类 #import <Foundation/Foundation.h> #impo ...

  8. LaTeX Software & Manuals

    LaTeX Software & Manuals How to Typeset Equations in LaTeX LaTeX is a very powerful tool for typ ...

  9. [Unity] Unity3D研究院编辑器之独立Inspector属性

    本文转自: http://www.xuanyusong.com/archives/3680雨松MOMO Unity提供了强大的Editor功能, 我们可以很轻易的在EditorGUI中绘制任意的属性. ...

  10. 固定IP 正常访问谷歌

    如题 地址栏直接输入 http://173.194.1.150/ 正常使用 ~标记一下~