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模板的更多相关文章

  1. HDU 2853 最大匹配&KM模板

    http://acm.hdu.edu.cn/showproblem.php?pid=2853 这道题初看了没有思路,一直想的用网络流如何解决 参考了潘大神牌题解才懂的 最大匹配问题KM 还需要一些技巧 ...

  2. hdu-2255 奔小康赚大钱---KM模板

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2255 题目大意: Problem Description 传说在遥远的地方有一个非常富裕的村落,有一 ...

  3. 二分匹配之最大权值匹配算法---KM模板

    百科:http://baike.baidu.com/link?url=vbM3H4XmfrsWfP-epdlR2sVKSNzOq4hXnWDqm5uo8fd7VWsF2SmhDV35XyVUDvVjv ...

  4. HDU 2853 & 剩余系+KM模板

    题意: 给你一张二分图,给一个原匹配,求原匹配改动最少的边数使其边权和最大. SOL: 我觉得我的智商还是去搞搞文化课吧..这种题给我独立做我大概只能在暴力优化上下功夫.. 这题的处理方法让我想到了剩 ...

  5. HDU1853 & 蜜汁建图+KM模板

    题意: 给你一个N个点M条边的带权有向图,现在要你求这样一个值:该有向图中的所有顶点正好被1个或多个不相交的有向环覆盖.这个值就是 所有这些有向环的权值和. 要求该值越小越好. SOL: 本来还想ta ...

  6. HDU 1533 & KM模板

    题意 求二分图最小完备匹配. SOL 建个图那么方便的事情是吧...然后边权都是正的(好像根边权也没什么关系),既然要求最小那么把边权取个相反数跑个KM就好了.. CODE: /*========== ...

  7. HDU 2255 & KM模板

    题意: 一张完备二分图求最优完备匹配. SOL: 这题就不讲什么sol了...毕竟是裸的KM,不会的话可以看老人家的大白鼠,一些问题看代码注释.讲讲经历(悲惨的经历) 刚打完,自信地交上去发现MLE. ...

  8. KM模板 最大权匹配(广搜版) Luogu P1559 运动员最佳匹配问题

    KM板题: #include <bits/stdc++.h> using namespace std; inline void read(int &num) { char ch; ...

  9. 图论--二分图最佳完美匹配(KM模板)

    #include <iostream> #include <cstring> #include <cstdio> using namespace std; cons ...

随机推荐

  1. c# UpdateLayeredWindow异形窗口

    #region UpdateLayeredWindow #region 重写窗体的 CreateParams 属性 protected override CreateParams CreatePara ...

  2. ARM体系结构

    工作模式_ufisaus USR(User) :正常程序的执行状态 FIQ(Fast interrupt) :用于高速数据传输和通道处理 IRQ(Interrupt) :通常的中断处理 SVC(Sup ...

  3. C语言中链表怎么删除结点?

    第一个方法: /*根据姓名删除链表的中的学生记录*/ void deleteByName(struct STUDENT * head) { struct STUDENT *p,*q; ]; if(he ...

  4. How to stop uwsgi when no pidfile in config?

    原文: how-to-stop-uwsgi-when-no-pidfile-in-config Q: I've just installed uwsgi by pip install uwsgi in ...

  5. switch结构的用法

    已知学生的名字和百分制分数.要求根据学生的百分制分数,分别采用"满分","优秀","良好","及格"和"不及格 ...

  6. Quartz集群

    为什么选择Quartz: 1)资历够老,创立于1998年,比struts1还早,但是一直在更新(27 April 2012: Quartz 2.1.5 Released),文档齐全. 2)完全由Jav ...

  7. Eclipse 代码自动提示的设置

    1. eclipse代码自动提示设置.如何配置eclipse的代码自动提示功能(同时解决自动补全变量名的问题)? 2. http://www.iteye.com/topic/1120919 [C++] ...

  8. lca入门———树上倍增法(博文内含例题)

    倍增求LCA: father[i][j]表示节点i往上跳2^j次后的节点 可以转移为 father[i][j]=father[father[i][j-1]][j-1] 整体思路: 先比较两个点的深度, ...

  9. git push时错误提示的解决办法 By default, updating the current branch in a non-bare repository error: is denied,

    在使用git将客户端的修改push到服务器上的时候,出现无法push,提示和stackoverflow上的http://stackoverflow.com/questions/2816369/git- ...

  10. C# String.split()用法小结。String.Split 方法 (String[], StringSplitOptions)

    split()首先是一个分隔符,它会把字符串按照split(' 字符')里的字符把字符串分割成数组,然后存给一个数组对象. 输出数组对象经常使用foreach或者for循环. 第一种方法 string ...