HDU 2853 最大匹配&KM模板
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模板的更多相关文章
- HDU 2853 & 剩余系+KM模板
题意: 给你一张二分图,给一个原匹配,求原匹配改动最少的边数使其边权和最大. SOL: 我觉得我的智商还是去搞搞文化课吧..这种题给我独立做我大概只能在暴力优化上下功夫.. 这题的处理方法让我想到了剩 ...
- 【HDU 2853】 KM算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 题意:有n个公司,m个任务,每个公司做每个任务都有一个效率值,最开始每个公司都指派了一个任务,现 ...
- hdu 2853 Assignment KM算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 Last year a terrible earthquake attacked Sichuan ...
- HDU 2853 Assignment(KM最大匹配好题)
HDU 2853 Assignment 题目链接 题意:如今有N个部队和M个任务(M>=N),每一个部队完毕每一个任务有一点的效率,效率越高越好.可是部队已经安排了一定的计划,这时须要我们尽量用 ...
- 【HDU 2853】Assignment (KM)
Assignment Problem Description Last year a terrible earthquake attacked Sichuan province. About 300, ...
- Assignment HDU - 2853(二分图匹配 KM 新边旧边)
传送门: Assignment HDU - 2853 题意:题意直接那松神的题意了.给了你n个公司和m个任务,然后给你了每个公司处理每个任务的效率.然后他已经给你了每个公司的分配方案,让你求出最多能增 ...
- 带权二分图最大匹配KM算法
二分图的判定 如果一个图是连通的,可以用如下的染色法判定是否二分图: 我们把X部的结点颜色设为0,Y部的颜色设为1. 从某个未染色的结点u开始,做BFS或者DFS .把u染为0,枚举u的儿子v.如果v ...
- HDU 2853 (KM最大匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 题目大意:二分图匹配费用流.①最大匹配②最小原配变动 解题思路: 如果去掉第二个要求,那么就是裸 ...
- HDU 2255 & KM模板
题意: 一张完备二分图求最优完备匹配. SOL: 这题就不讲什么sol了...毕竟是裸的KM,不会的话可以看老人家的大白鼠,一些问题看代码注释.讲讲经历(悲惨的经历) 刚打完,自信地交上去发现MLE. ...
随机推荐
- mysql 字符串
mysql中一个字符串,既可以用两个单引号表示,也可以用两个双引号表示. 比如字符串 wangxiaowei,用单引号表示 'wangxiaowei',双引号表示"wangxiaowei&q ...
- Javascript中call、apply、bind函数
javascript在函数创建的时候除了自己定义的参数外还会自动新增this和arguments两个参数 javascript中函数也是对象,call.apply.bind函数就是函数中的三个函数,这 ...
- C风格字符串与C++风格字符串
C风格字符串与C++风格字符串 C风格字符串:对字符串进行操作的 C 函数定义在头文件<cstring>中: 1. 字符串定义:char* result: 2. 字符串的最后一个字符是nu ...
- json 是个什么东西?
JSONP原理 JSONP(JSON with Padding),就是异步请求跨域的服务器端时,不是直接返回数据,而是返回一个js方法,把数据作为参数传过来.如果只是跨域传递数据那么这种方式是比较好的 ...
- Jquerymobile 简单安装
需要导入三个文件jquery,jquerymobile,css(jquerymobile地址:http://jquerymobile.com/) <script src="js/jqu ...
- 使用session防止重复提交
一.表单重复提交的常见应用场景 <%@ page language="java" import="java.util.*" pageEncoding=&q ...
- Java并发编程核心方法与框架-TheadPoolExecutor的使用
类ThreadPoolExecutor最常使用的构造方法是 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAli ...
- redis使用watch完成秒杀抢购功能(转)
redis使用watch完成秒杀抢购功能: 使用redis中两个key完成秒杀抢购功能,mywatchkey用于存储抢购数量和mywatchlist用户存储抢购列表. 它的优点如下: 1. 首先选用内 ...
- ASP.NET MVC 4+ T.JPager使用
一.同步Link模式 var pagecount = TCalcPager.CalcPageCount(count, pageSize); var page = new TBuilderLinkPag ...
- JS网页加载进度条
参考:http://www.cnblogs.com/timy/archive/2011/12/07/2279200.html