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 ...
随机推荐
- boneCP原理研究
** 转载请注明源链接:http://www.cnblogs.com/wingsless/p/6188659.html boneCP是一款关注高性能的数据库连接池产品 github主页 . 不过最近作 ...
- innoDB源码分析--缓冲池
最开始学Oracle的时候,有个概念叫SGA和PGA,是非常重要的概念,其实就是内存中的缓冲池.InnoDB的设计类似于Oracle,也会在内存中开辟一片缓冲池.众所周知,CPU的速度和磁盘的IO速度 ...
- Spark SQL 官方文档-中文翻译
Spark SQL 官方文档-中文翻译 Spark版本:Spark 1.5.2 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 概述(Overview) 2 Data ...
- 为什么是 Cloud Service?
怀旧一把,还记得这个界面吗? 没错,这是第一版Windows Azure Management Portal,用Silverlight开发的,很炫! 奇怪,为什么没有Virtual Machine? ...
- django用户登录和注销
django版本:1.4.21. 一.准备工作 1.新建项目和app [root@yl-web-test srv]# django-admin.py startproject lxysite [roo ...
- [麦先生]TP3.2之微信开发那点事[基础篇](网页授权开发之小Demo)
用户à 点击按钮进入授权页面并确认授权à 服务器返回code给开发者à 利用code,APPID,APPsecret组合数据请求API获取access_token和openidà 利用access_t ...
- NOIP2014飞扬的小鸟[DP][WRONG]
坑人啊朴素的dp 75分 用了完全背包才是80分,结果普遍偏小 为什么啊啊啊啊啊 等以后再写一遍吧 #include<iostream> #include<cstdio> #i ...
- PHP中文名文件下载实现
php下载文件的流程: 其实就是给予一个链接: <a href="指向处理文件的地址"></a> 这样,当前端点击链接的时候,指向处理文件,比如downl ...
- html5游戏-包围盒检测算法
矩形包围盒算法:检测2个矩形是否重叠,在这样情况下要判断2个矩形是否碰撞只需要比较两个矩形顶点的坐标即可.假设矩形A用(x1,y1)表示左上角,(x2,y2)表示右下角,矩形B用(x3,y3)表示左上 ...
- 01Spring_基本jia包的导入andSpring的整体架构and怎么加入日志功能
1.什么是Spring : v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:u ...