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. Iterator(迭代器)的使用

    迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...

  2. HBase应用开发回顾与总结系列之二:RowKey行键设计规范

    2. RowKey行键设计规范 2.1. RowKey四大特性 2.1.1 字符串类型 虽然行键在HBase中是以byte[]字节数组的形式存储的,但是建议在系统开发过程中将其数据类型设置为Strin ...

  3. linux挂载windows上的共享文件夹

    假定win机d:/folder/share的共享名为 share , 有用户administrator ,密码123 在linux机上,把share挂到/mnt目录:mount -t cifs -o ...

  4. 文件上传&文件下载

    一.单个文件上传 文件上传需要两个jar包: 首先制作一个简单的页面,用于实现文件上传 <h1>单个文件上传</h1> <s:form action="uplo ...

  5. luogu1207双重回文数[usaco1.2]Dual Palindromes

    题目描述 如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”.例如,12321就是一个回文数,而77778就不是.当然,回文数的首和尾都应是非零的,因此0220就不是回文数. 事实上 ...

  6. Centos5.8 安装SVN并配置HTTP访问

    安装 svn sudo yum install subversion 测试 svn --version 安装 httpd 的 svn 模块 sudo yum install mod_dav_svn 前 ...

  7. 在PHP中无法连接Memcached的解决办法

    Memcached 已经正确安装配置, 并且防火墙也已经打开了本机对自己所有端口的访问, telnet localhost 11211也正常, 但是通过PHP访问出现 [Sat May 17 22:0 ...

  8. NOI2018准备 Day8

    清北学堂入学测试,6道题凑了363分,平均466才能达到省选班的程度,差距不小. 今天突然感觉最大的BOSS是搜索,虽然每次都写崩...... 3个小时写了一道DP没写出来 但我不会忘记,我的首个目标 ...

  9. script实现的日期表示

    function clockon(bgclock){ var now=new Date(); var year=now.getYear(); var month=now.getMonth(); var ...

  10. java:如何让程序按要求自行重启?

    正文开始前的废话: 这里的程序即包括b/s的web application,也包括standalone的类c/s的java application.   为什么要自我重启?   场景1:分布式环境中, ...