KM模板
var
n,m,i,j:longint;
ans:int64;
sel,lx,ly,slack:array[..] of int64;
a:array[..,..] of int64;
visx,visy:array[..] of boolean; function dfs(po:longint):boolean;
var
i:longint;
t:int64;
begin
visx[po]:=true; for i:= to m do
if visy[i]=false then
begin
t:=lx[po]+ly[i]-a[po,i];
if t= then
begin
visy[i]:=true;
if sel[i]= then
begin
sel[i]:=po;
exit(true);
end else
if dfs(sel[i]) then
begin
sel[i]:=po;
exit(true);
end;
end else
if slack[i]>t then slack[i]:=t;
end;
exit(false);
end; procedure km;
var
i,j:longint;
d:int64;
begin
for i:= to n do
lx[i]:=-*maxlongint; for i:= to n do
for j:= to m do
if a[i,j]>lx[i] then lx[i]:=a[i,j]; for i:= to n do
begin
while true do
begin
fillchar(visx,sizeof(visx),);
fillchar(visy,sizeof(visy),);
for j:= to m do
slack[j]:=*maxlongint; if dfs(i) then break; d:=*maxlongint; for j:= to m do
if (visy[j]=false) and (slack[j]<d) then d:=slack[j]; for j:= to n do
if visx[j] then dec(lx[j],d); for j:= to m do
if visy[j] then inc(ly[j],d);
end;
end;
end; begin
read(n,m); for i:= to n do
for j:= to m do
begin
read(a[i,j]);
end; km; for i:= to n do ans:=ans+lx[i]; for i:= to m do ans:=ans+ly[i]; writeln(ans);
end.
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std; int m,n,k;
int visx[],visy[],sel[];
long long lx[],ly[],a[][],slack[]; int dfs(int po){
visx[po]=;
for (int i=;i<=m;i++)
if (visy[i]==){
long long t=lx[po]+ly[i]-a[po][i];
if (t==){
visy[i]=;
if ((sel[i]==-)||(dfs(sel[i]))){
sel[i]=po;
return();
}
}else slack[i]=min(slack[i],t);
}
return();
} void km(){
for (int i=;i<=n;i++) lx[i]=-1e10;
for (int i=;i<=m;i++) ly[i]=;
for (int i=;i<=m;i++) sel[i]=-;
for (int i=;i<=n;i++)
for(int j=;j<=m;j++)
lx[i]=max(lx[i],a[i][j]); for (int i=;i<=n;i++)
while (){
for (int j=;j<=n;j++) visx[j]=;
for (int j=;j<=m;j++) visy[j]=,slack[j]=1e10; if (dfs(i)) break; long long d=1e10;
for (int j=;j<=m;j++)
if (visy[j]==)
d=min(d,slack[j]); for (int j=;j<=n;j++)
if (visx[j]) lx[j]-=d; for (int j=;j<=m;j++)
if (visy[j]) ly[j]+=d;
}
} int main(){
int T;
scanf("%d",&T);
while (T--){
scanf("%d%d%d",&n,&m,&k); for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
a[i][j]=; for (int i=;i<=k;i++){
int x,l,p,r;
scanf("%d%d%d%d",&x,&l,&r,&p);
for (int j=l;j<=r;j++) a[x][j]=p;
} km();
long long ans1=;
for (int i=;i<=n;i++) ans1+=lx[i];
for (int i=;i<=m;i++) ans1+=ly[i]; for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
a[i][j]*=-; km();
long long ans2=;
for (int i=;i<=n;i++) ans2-=lx[i];
for (int i=;i<=m;i++) ans2-=ly[i]; if (ans1==ans2) printf("YES\n");else printf("NO\n");
}
}
求最小值所有边取相反数后KM,输出有答案的相反数
求最小乘积先求对数再KM
KM模板的更多相关文章
- HDU 2853 最大匹配&KM模板
http://acm.hdu.edu.cn/showproblem.php?pid=2853 这道题初看了没有思路,一直想的用网络流如何解决 参考了潘大神牌题解才懂的 最大匹配问题KM 还需要一些技巧 ...
- hdu-2255 奔小康赚大钱---KM模板
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2255 题目大意: Problem Description 传说在遥远的地方有一个非常富裕的村落,有一 ...
- 二分匹配之最大权值匹配算法---KM模板
百科:http://baike.baidu.com/link?url=vbM3H4XmfrsWfP-epdlR2sVKSNzOq4hXnWDqm5uo8fd7VWsF2SmhDV35XyVUDvVjv ...
- HDU 2853 & 剩余系+KM模板
题意: 给你一张二分图,给一个原匹配,求原匹配改动最少的边数使其边权和最大. SOL: 我觉得我的智商还是去搞搞文化课吧..这种题给我独立做我大概只能在暴力优化上下功夫.. 这题的处理方法让我想到了剩 ...
- HDU1853 & 蜜汁建图+KM模板
题意: 给你一个N个点M条边的带权有向图,现在要你求这样一个值:该有向图中的所有顶点正好被1个或多个不相交的有向环覆盖.这个值就是 所有这些有向环的权值和. 要求该值越小越好. SOL: 本来还想ta ...
- HDU 1533 & KM模板
题意 求二分图最小完备匹配. SOL 建个图那么方便的事情是吧...然后边权都是正的(好像根边权也没什么关系),既然要求最小那么把边权取个相反数跑个KM就好了.. CODE: /*========== ...
- HDU 2255 & KM模板
题意: 一张完备二分图求最优完备匹配. SOL: 这题就不讲什么sol了...毕竟是裸的KM,不会的话可以看老人家的大白鼠,一些问题看代码注释.讲讲经历(悲惨的经历) 刚打完,自信地交上去发现MLE. ...
- KM模板 最大权匹配(广搜版) Luogu P1559 运动员最佳匹配问题
KM板题: #include <bits/stdc++.h> using namespace std; inline void read(int &num) { char ch; ...
- 图论--二分图最佳完美匹配(KM模板)
#include <iostream> #include <cstring> #include <cstdio> using namespace std; cons ...
随机推荐
- spring中各jar功能及jar包之间的依赖关系
(1) spring-core.jar 这个jar文件包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工 ...
- Macbook无法上网,访问不了appstore、safria、网易云等,但QQ、谷歌浏览器可以用--解决方案
---------------------我是分割线 update 2016-09-22 20:55:22----------------------------- 发现之前那个方法也是不稳定,后来 ...
- 二:Go编程语言规范-类型
1.类型 布尔值,数值与字符串类型的实例的命名是预声明的. 数组,结构,指针,函数,接口,切片,映射和信道这些复合类型可由类型字面构造. 每个类型 T 都有一个 基本类型:若 T 为预声明类型或类型字 ...
- 彻底理解JavaScript原型
原型是JavaScript中一个比较难理解的概念,原型相关的属性也比较多,对象有"[[prototype]]"属性,函数对象有"prototype"属性,原型对 ...
- 报表引擎API开发入门— EJB程序数据源
我们前面讲了几个数据源,今天我们来讲一下EJB数据源,这篇讲完我们数据源这部分就讲完了.数据连接不需要直接访问数据库,而是使用EJB做为数据源.FR通过定义程序数据集使用EJB的相关类获取到EJB数据 ...
- Scikit-Learn模块学习笔记——数据集模块datasets
scikit-learn 的 datasets 模块包含测试数据相关函数,主要包括三类: datasets.load_*():获取小规模数据集.数据包含在 datasets 里 datasets.fe ...
- save(),saveorupdate()还有marqe()
所有这三个方法,也就是save().saveOrUpdate()和persist()都是用于将对象保存到数据库中的方法,但其中有些细微的差别.例如,save()只能INSERT记录,但是saveOrU ...
- TextView和EditText中的setFilters方法说明
在TextView中有一个方法public void setFilters(InputFilter[] filters),API中有一句说明:Sets the list of input filter ...
- ip的划分,超详细
from:http://blog.liuts.com/post/128/ IP和子网掩码我们都知道,IP是由四段数字组成,在此,我们先来了解一下3类常用的IP A类IP段 0.0.0.0 到127.2 ...
- Python的高级特性4:函数式编程
函数式编程的核心就是把函数当成对象来进行编程. 有两个常用到的方法:map/reduce,filter,其中map和filter是内建方法,而reduce不是,所以需要import相关模块. map接 ...