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 ...
随机推荐
- SQL Server 中获取字符串拼音的标量函数实现
工作中时常遇到字符串转换为拼音的需求.特别目前在各大网站平台都可以看到的基于拼音的查询功能.如果在查询中增加相应的拼音查询,就可以减少很多的因中文汉字完全输入的不便利,例如:当我要查询叫”郭德 ...
- RedHat Linux 9.0的安装+入门指南(图文并茂)
一,准备工作1,购买或下载Redhat9的安装光盘(3张盘)或镜像文件2,在硬盘中至少留2个分区给安装系统用,挂载点所用分区推荐4G以上,交换分区不用太大在250M左右比较适合,文件系统格式不论,反正 ...
- 九、Android学习第八天——广播机制与WIFI网络操作(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 九.Android学习第八天——广播机制与WIFI网络操作 今天熟悉了An ...
- linux线程同步(3)-读写锁
一.概述 读写锁与互斥量的功能类似,对临界区的共享资源进行保护!互斥量一次只让一个线程进入临界区, ...
- 大话设计模式C++版——装饰模式
女人常说男人喜新厌旧,只见新人笑,那闻旧人哭,但装饰模式(Decorator)却是一种结交新朋友不忘老朋友的设计模式,非常适合去古代当老公(现代是不行的,因为只能娶一个老婆了).装饰模式的本质是每一个 ...
- jmeter 监控服务器的内存,cpu等内容
1.需要下载一个jar包,放入到lib /ext文件中 JMeterPlugins-Standard.jar 2.在服务器上安装 perfmon server agent 这里监控内存我们使用的是: ...
- 嵌入式Linux驱动学习之路(九)Linux系统调用、驱动程序框架
应用程序通过open read write close 等函数来操作计算机硬件.类似是一个接口. 当应用程序调用这些接口程序时,计算机是如何进入内核的呢?这是经过了系统调用. 实际上当调用接口函数 ...
- java 26 - 8 网络编程之 TCP协议上传图片
上次的是上传TXT文件,这次上传的是图片.同样,上传成功需要反馈给客户端. 区别: TXT文件用记事本打开,我们可以看得懂,所以用了缓冲字符流,对通道内的字节流进行包装了. 而图片用记事本打开,我们看 ...
- java 24 - 10 GUI 之 四则预算的数据校验
我想要在校验的过程中,如果输入到操作数中的不是数字,则弹出提醒框: 类 JOptionPane 有助于方便地弹出要求用户提供值或向其发出通知的标准对话框 方法名 描述 showConfirmDial ...
- SQL Server系统表sysobjects介绍与使用(转))
这就让sysobjects表格有了用武之地.虽然我不建议你更新这个表格,但是你当然有权对其进行审查. sysobjects 表 在数据库内创建的每个对象(约束.默认值.日志.规则.存储过程等)在表中 ...