具体方法就不介绍了,详见 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. axios 基本运用

    axios是专门对ajax请求进行封装的一个插件,其返回一个promise对象,用法跟ES6的promise很相似 一.安装axios插件npm install axios 二.引入axios插件 在 ...

  2. 21-5-split

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. js只能输入数字和小数点

    1.文本框只能输入数字代码(小数点也不能输入)<input onkeyup="this.value=this.value.replace(/\D/g,'')" onafter ...

  4. 【笔记篇】单调队列优化dp学习笔记&&luogu2569_bzoj1855股票交♂易

    DP颂 DP之神 圣洁美丽 算法光芒照大地 我们怀着 崇高敬意 跪倒在DP神殿里 你的复杂 能让蒟蒻 试图入门却放弃 在你光辉 照耀下面 AC真心不容易 dp大概是最经久不衰 亘古不化的算法了吧. 而 ...

  5. css悬浮在页面顶端

    .header{ position:fixed; margin-top:; width:%; z-index:; } .body{ position:relative; padding-top:119 ...

  6. MySQL学习 EXISTS的用法 转载

    比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID ...

  7. 5020: [THUWC 2017]在美妙的数学王国中畅游

    传送门 当年听llj讲的时候觉得这简直是个不可做的神题. 现在看来并不是很神,可能是我已经被剧透了的缘故... 一开始以为是函数套函数,懵蔽了好久,结果只是求和 被剧透了泰勒展开就比较水了..只要你不 ...

  8. socket2里面,有些函数带WSA开头,有些不带。请问有何区别?

    WSASocket可以使用WinSock特有功能,比如重叠IO,用dwflags指定.    WSA的A是指api,用于区别spi,因为在spi中还有wspsocket,wspaccept等... 在 ...

  9. iOS开发UIMotionEffect运动视觉效果

    1.UIMotionEffect简介 在iOS7.0推出了UIMotionEffect运动视觉效果,就是从屏幕偏移不同角度.看到的效果不同! NS_CLASS_AVAILABLE_IOS(7_0) @ ...

  10. 海量可视化日志分析平台之ELK搭建

    ELK是什么? E=ElasticSearch ,一款基于的Lucene的分布式搜索引擎,我们熟悉的github,就是由ElastiSearch提供的搜索,据传已经有10TB+的数据量. L=LogS ...