具体方法就不介绍了,详见 https://blog.csdn.net/sixdaycoder/article/details/47720471

主要讲一些注意点:

1:不直接将未匹配的y减小是因为要保证lx[i]+ly[j]>=w[i][j],证明详见上述博客

2:因为多组数据,所有数组都记得清零

3:dfs中坑了我20多次MLE……记得visx,visy数组都要更新

4:这种做法仅限于每一个点都能被匹配的情况,若不能都匹配就要用网络流

5:只有在值相等时才能赋值visy

二分图匹配模板题:(值得思考)

 #include<bits/stdc++.h>
using namespace std;
int V,n,m,e;
vector<int> v[];
int vis[],match[]; int init()
{
memset(match,-,sizeof(match));
scanf("%d%d%d%d",&V,&n,&m,&e);
for(int i=;i<=e;i++)
{
int x,y;
scanf("%d%d",&x,&y); y+=n;
v[x].push_back(y);
}
} int dfs(int u)
{
for(int i=;i<(int)v[u].size();i++)
{
int p=v[u][i];
if(vis[p]) continue;
vis[p]=;
if(match[p]==-||dfs(match[p])==)
{
match[u]=p;
match[p]=u;
return ;
}
}
return ;
} int main()
{
int sum=;
init();
for(int i=;i<=n;i++)
{
if(match[i]==-)
{
memset(vis,,sizeof(vis));
if (dfs(i)) sum++;
}
}
printf("%d\n",min(V+,n+m-sum));
return ;
}

KM模板题

#include<cstdio>
#include<cstring>
using namespace std;
const int N=;
const int inf=0X3f3f3f; int w[N][N];
int n,ans=;
int lx[N],ly[N],match[N],slack[N];
bool visx[N],visy[N]; void init()
{
for(int i=;i<n;i++) visy[i]=;
for(int i=;i<n;i++) visx[i]=;
} bool dfs(int u)
{
int Delta;
visx[u]=;
for(int v=;v<n;++v)
{
if(visy[v]) continue;
Delta=lx[u]+ly[v]-w[u][v];
if(Delta==)
{
visy[v]=;
if(match[v]==-||dfs(match[v]))
{
match[v]=u;
return true;
}
}
else if(slack[v] > Delta)
slack[v] = Delta;
}
return false;
} void KM()
{
for(int x=;x<n;++x)
{
for(int y=;y<n;++y) slack[y]=inf;
while(true)
{
init();
if(dfs(x)) break;
int delta=inf;
for(int j=;j<n;++j) if(!visy[j]&&delta>slack[j]) delta=slack[j];
for(int i=;i<n;++i) if(visx[i]) lx[i]-=delta;
for(int j=;j<n;++j)
{
if(visy[j]) ly[j]+=delta;
else slack[j]-=delta;//important
}
}
}
} int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(match,-,sizeof(match));
memset(ly,,sizeof(ly));
for(int i=;i<n;++i) match[i]=-;
for(int i=;i<n;++i)
{
for(int j=;j<n;++j)
{
scanf("%d",&w[i][j]);
}
}
for(int i=;i<n;++i)
{
lx[i]=-inf;
for(int j=;j<n;j++) if(lx[i]<w[i][j]) lx[i]=w[i][j];
}
KM(); ans=;
for(int i=;i<n;++i)
{
if(match[i]!=-) ans+=w[match[i]][i];
}
printf("%d\n",ans);
}
return ;
}

模板——二分图匹配KM的更多相关文章

  1. 训练指南 UVALive - 4043(二分图匹配 + KM算法)

    layout: post title: 训练指南 UVALive - 4043(二分图匹配 + KM算法) author: "luowentaoaa" catalog: true ...

  2. 牛客多校第五场 E room 二分图匹配 KM算法模板

    链接:https://www.nowcoder.com/acm/contest/143/E来源:牛客网 Nowcoder University has 4n students and n dormit ...

  3. hdu1853 Cyclic Tour (二分图匹配KM)

    Cyclic Tour Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others)Total ...

  4. [洛谷P3386] [模板] 二分图匹配 (匈牙利算法)

    题目传送门 毒瘤出题人zzk出了个二分图匹配的题(18.10.04模拟赛T2),逼我来学二分图匹配. 网络流什么的llx讲完之后有点懵,还是匈牙利比较好理解(绿与被绿). 对于左边的点一个一个匹配,记 ...

  5. 二分图匹配--KM算法

    Kuhn-Munkres算法 KM算法,求完备匹配下的最大权匹配,时间复杂度O(\(n^3\)) 所谓的完备匹配就是在二部图中,x点集中的所有点都有对应的匹配 且 y点集中所有的点都有对应的匹配 ,则 ...

  6. 【洛谷 p3386】模板-二分图匹配(图论)

    题目:给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数. 解法:匈牙利算法.(以前我总是不记得......)实质上应该有贪心的思想,每次都尽量匹配,找到能和自己匹配的也尽量让它们匹配 ...

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

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

  8. 运动员最佳匹配问题 KM算法:带权二分图匹配

    题面: 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势:Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势. ...

  9. 二分图匹配之最佳匹配——KM算法

    今天也大致学了下KM算法,用于求二分图匹配的最佳匹配. 何为最佳?我们能用匈牙利算法对二分图进行最大匹配,但匹配的方式不唯一,如果我们假设每条边有权值,那么一定会存在一个最大权值的匹配情况,但对于KM ...

随机推荐

  1. 【模板篇】k短路 SDOI2010 魔法猪学院

    题目传送门 吐槽时间 题目分析 代码 题目の传送门 都成了一道模板题了OvO ============================================================= ...

  2. this 、typeof、false、parseInt()、this、arguments、Array和object判断

    typeof typeof (undefined) 不会报错 undefined object Number boolean function String 返回值为字符串类型 false .fals ...

  3. 微信小程序为什么看不到所有的console.log()的日志信息

    记录一个巨傻无比的问题 1.在首页的onLoad()函数里面,加了地理位置的加载,并打印到控制台上,可是今天就是没出现 2.然后纳闷的很久,各种google,发现没有人遇到这个问题 3.再然后,我就看 ...

  4. java8--Stream的flatmap与map异同的理解

    大纲: 异同点 示例 一.异同点 他们的相同点是接收的入参都是一个function. 不同点这个入参function的返回不同.map返回一个对象,flatmap返回一个stream. 这就使得map ...

  5. lombok使用手册

    lombok使用手册: 1.安装插件 1.1.idel: 1.2.使用lombok还需要引用相关jar包 参考网址:https://projectlombok.org/features/all 2.注 ...

  6. expect离线安装

    expect5.45.4.tar.gz和tcl8.4.11-src.tar.gz压缩包请前往以下链接下载: https://download.csdn.net/download/gangzi221/1 ...

  7. LUOGU P2261 [CQOI2007]余数求和(数论分块)

    传送门 解题思路 数论分块,首先将 \(k\%a\) 变成 \(k-a*\left\lfloor\dfrac{k}{a}\right\rfloor\)形式,那么\(\sum\limits_{i=1}^ ...

  8. php socket 发送HTTP请求 POST json

    * HttpRequest.php <?php namespace et\http; /** * Created by PhpStorm. * User: mingzhanghui * Date ...

  9. System.Web.Mvc.IAuthorizationFilter.cs

    ylbtech-System.Web.Mvc.IAuthorizationFilter.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutra ...

  10. 阿里云CentOs7上安装Tomcat

    一.下载安装tomcat8 cd /usr/ #创建tomcat目录 mkdir tomcat #从网上download 压缩包 wget tomcat8 url #解压 tar -zxvf apac ...