具体方法就不介绍了,详见 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. 《构建之法》CH5~6读书笔记 PB16110698 第九周(~5.15)

    这段时间我阅读了<构建之法>的大部分章节,包括个人技能.软件测试.用户体验和需求分析等相关内容.之前的个人作业和结对作业结束后,我们的工作重心终于转向了团队项目,作为团队中前端组的组长,我 ...

  2. django项目基础

    D:\>django-admin startproject GodWork1 D:\>cd GodWork1 D:\GodWork1>python manage.py startap ...

  3. 【CSP-S/J 2019】初赛注意事项

    UPD:10-25-13:33 正式成绩出了,省里500多名应该进了吧... UPD:10-20-10:07 现在又很慌啊,怎么感觉82又一点都不稳啊... 然后现在又不太想写文化课作业...我是不是 ...

  4. PHP算法之删除最外层的括号

    有效括号字符串为空 ("")."(" + A + ")" 或 A + B,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接.例如 ...

  5. java多线程-AbstractQueuedSynchronizer

    大纲: AbstractQueuedSynchronizer简介 aqs基本结构 aqs应用-ReentrantLock.lock aqs应用-ReentrantLock.unlock aqs应用-S ...

  6. [JZOJ2865]【集训队互测 2012】Attack

    题目 题目大意 平面上有一堆带权值的点.两种操作:交换两个点的权值,查找一个矩形的第\(k\)小 \(N<=60000\) \(M<=10000\) \(10000ms\) 思考历程&am ...

  7. 廖雪峰Java16函数式编程-1Lambda表达式-3方法引用

    Java8引入了Lambda表达式,可以不必编写FunctionalInterface的实现类,直接写Lambda表达式.除了Lambda表达式,我们还可以直接传入方法引用 方法引用是指:如果某个方法 ...

  8. CSS——滑动门技术及应用

    先来体会下现实中的滑动门,或者你可以叫做推拉门: 滑动门出现的背景 制作网页时,为了美观,常常需要为网页元素设置特殊形状的背景,比如微信导航栏,有凸起和凹下去的感觉,最大的问题是里面的字数不一样多,咋 ...

  9. csp-s模拟测试90

    csp-s模拟测试90 考场发明$Spfa$祭. $T1$按照题意模拟,然后我就发现我死了.一气之下删掉了$priority$,拍了几下发现贼jb快而且还是对的就开心地交了.$T2$的差分状态定义很棒 ...

  10. 如何区分无线AP跟无线路由器

    无线AP是一个无线网络的接入点,俗称“热点”.主要有路由交换接入一体设备和纯接入点设备,一体设备执行接入和路由工作,纯接入设备只负责无线客户端的接入,纯接入设备通常作为无线网络扩展使用,与其他AP或者 ...