贴板子系列_1-km算法,匈牙利算法
#include <bits/stdc++.h>
#define N 1500
#define inf 999999999
using namespace std;
int a[N],bs[N],nx=,ny=,k;
int linky[N],lx[N],ly[N],slack[N];
int visx[N],visy[N],w[N][N];
int min(int a,int b){return (a<b)?a:b;}
int find(int x){
visx[x]=;
for(int y=;y<=ny;y++){
if(visy[y]) continue;
int t=lx[x]+ly[y]-w[x][y];
if(t==){visy[y]=;
if(linky[y]==-||find(linky[y])){
linky[y]=x;return ;
}
}
else if(slack[y]>t) slack[y]=t;
}
return ;
}
int km(){
memset(linky,-,sizeof(linky));
memset(ly,,sizeof(ly));
for(int i=;i<=nx;i++) lx[i]=-inf;
for(int i=;i<=nx;i++)for(int j=;j<=ny;j++)if(w[i][j]>lx[i])lx[i]=w[i][j];
for(int x=;x<=nx;x++){
for(int i=;i<=ny;i++)
slack[i]=inf;
while(){
memset(visx,,sizeof(visx));
memset(visy,,sizeof(visy));
if(find(x)) break;
int d=inf;
for(int i=;i<=ny;i++) if(!visy[i]&&d>slack[i]) d=slack[i];
for(int i=;i<=nx;i++) if(visx[i]) lx[i]-=d;
for(int i=;i<=ny;i++) if(visy[i]) ly[i]+=d; else slack[i]-=d;
}
}
int result=;
for(int i=;i<=ny;i++)
if(linky[i]>-) result+=w[linky[i]][i];
return result;
}
int main(){
scanf("%d%d%d",&nx,&ny,&k);
for(int i=;i<=k;i++){
int a,b,c;scanf("%d%d%d",&a,&b,&c);
w[a][b]=c;
}printf("%d\n",km());
return ;
}
#include <cstdio>
#include <cstring>
#define N 1010
using namespace std;
int map[N][N];
int max,x1,m,y1,tot,ans;
int used[N],link[N];
int find(int t)
{
for(int i=;i<=y1;i++)
{
if(used[i]==&&map[t][i]==)
{
used[i]=;
if(link[i]==||find(link[i]))
{
link[i]=t;
return ;
}
}
}
return ;
}
int main()
{
scanf("%d%d%d%d",&max,&x1,&y1,&m);
max++;tot=x1+y1;
for(int i=;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
map[a][b]=;
}
for(int i=;i<=y1;i++)link[i]=;
for(int i=;i<=x1;i++)
{
for(int i=;i<=y1;i++) used[i]=;
if(find(i))
ans++;
}
printf("%d\n",(max<tot-ans)? max:tot-ans);
return ;
}
贴板子系列_1-km算法,匈牙利算法的更多相关文章
- 【入门】匈牙利算法+HNOI2006 hero超级英雄
一.关于匈牙利算法 匈牙利算法是由匈牙利数学家Edmonds提出的,用增广路径求二分图最大匹配的算法. 听起来高端,其实说白了就是: 假设不存在单相思(单身狗偷偷抹眼泪),在一个同性恋不合法的国家里( ...
- 匈牙利算法dfs模板 [二分图][二分图最大匹配]
最近学了二分图最大匹配,bfs模板却死活打不出来?我可能学了假的bfs 于是用到了dfs模板 寻找二分图最大匹配的算法是匈牙利算法 匈牙利算法的主要程序是寻找增广路 寻找增光路是过程是:从一个未经配对 ...
- (转)二分图匹配匈牙利算法与KM算法
匈牙利算法转自于: https://blog.csdn.net/dark_scope/article/details/8880547 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名 ...
- 匈牙利算法与KM算法
匈牙利算法 var i,j,k,l,n,m,v,mm,ans:longint; a:..,..]of longint; p,f:..]of longint; function xyl(x,y:long ...
- 匈牙利算法、KM算法
PS:其实不用理解透增广路,交替路,网上有对代码的形象解释,看懂也能做题,下面我尽量把原理说清楚 基本概念 (部分来源.部分来源) 二分图: 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相 ...
- 二分图的最大匹配以及带权匹配【匈牙利算法+KM算法】
二分图算法包括 匈牙利算法 与 KM算法. 匈牙利算法 在这里写上模板. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 #include< ...
- Hungary(匈牙利算法)——二分图最大匹配
在复习匈牙利算法的时候,发现这么一篇介绍匈牙利算法的文章,非常通俗易懂,所以就借鉴过来了. 复杂度:邻接矩阵:O(v^3)邻接表:O(V*E) 附上链接:趣写算法系列之--匈牙利算法 下面就附上代码吧 ...
- "《算法导论》之‘图’":不带权二分图最大匹配(匈牙利算法)
博文“二分图的最大匹配.完美匹配和匈牙利算法”对二分图相关的几个概念讲的特别形象,特别容易理解.本文介绍部分主要摘自此博文. 还有其他可参考博文: 趣写算法系列之--匈牙利算法 用于二分图匹配的匈牙利 ...
- 51 NOd 2006 飞行员配对(匈牙利算法二分匹配)
题目来源: 网络流24题 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一 ...
随机推荐
- mydumper工作原理 :myownstars专家
http://blog.itpub.net/15480802/viewspace-1465080/
- linux下svn服务搭建
安装svn需要依赖apr和apr-util这两个软件,所以先安装这两个软件 下载安装APR wget http://apache.fayea.com//apr/apr-1.5.2.tar.gz .ta ...
- PHP + ajax 实现异步登录验证
login.html: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...
- js 注册手机摇动事件
var rockModule = (function () { //监听手机摇动事件 if (window.DeviceMotionEvent) { window.addEventListener(' ...
- js_BOM_05
1.下拉级联 |-select的API |-如何获得选中的option? |-如何创建option? |-如何将option添加到select? |-如何移 ...
- java Spring 生命周期
1.初始化回调 <bean name="userService" class="com.sun.service.UserService" init-met ...
- jpGraph的应用及基本安装配置 BY 命运
1.---jpGraph其实就是一个图表类库,会让开发者们作图非常方便,只要几行代码就可以勾画出非常炫的图表. 官方下载地址是:http://jpgraph.net/download/ jpGra ...
- jbpm4 回退、会签、撤销、自由流
http://blog.csdn.net/xiaozhang0731/article/details/8699558 1. jBPM4的特点 jBPM是JBoss众多开源项目中的一个工作流开源项目,也 ...
- OC与Swift的区别四(条件语句)
12.条件语句的区别,此处只写区别,没有指出区别的其他方面oc与swift基本一致 12.1 oc中for if switch语句体如果只有一行代码,则{}可以省略 swift中for if swit ...
- javascript面向对象程序设计系列(一)---创建对象
javascript是一种基于对象的语言,但它没有类的概念,所以又和实际面向对象的语言有区别,面向对象是javascript中的难点之一.现在就我所理解的总结一下,便于以后复习: 一.创建对象 1.创 ...