前置姿势

\(k\)维空间内两点曼哈顿距离中绝对值的处理

戳这里:[CF1093G]Multidimensional Queries

多路增广的费用流

据说这个东西叫做ZKW费用流?

流程其实很简单,就是把EK中的单路回溯改成利用DFS多路增广,类似Dinic那样,可以看作是EK的一个优化。需要注意的是要标记从源点到当前点的路径,以免陷入零环无法自拔。

代码

bool spfa(){
memset(dis,0x3f,sizeof dis);
rin(i,1,n)cur[i]=head[i];
while(!q.empty())q.pop();
dis[s]=0,book[s]=true;q.push(s);
while(!q.empty()){
int x=q.front();q.pop();
trav(i,x){
int ver=e[i].to;
if(e[i].cap&&dis[ver]>dis[x]+e[i].cost){
dis[ver]=dis[x]+e[i].cost;
if(!book[ver]){
book[ver]=true;
q.push(ver);
}
}
}
book[x]=false;
}
return dis[t]<1e9;
} int dfs(int x,int pref){
if(x==t||!pref)return pref;
int temp=0,flow=0;insta[x]=true;
for(int &i=cur[x];i;i=e[i].nxt){
int ver=e[i].to;if(insta[ver])continue;
if(dis[ver]==dis[x]+e[i].cost&&(temp=dfs(ver,std::min(pref,e[i].cap)))){
e[i].cap-=temp;
e[i^1].cap+=temp;
flow+=temp;
pref-=temp;
mincost+=temp*e[i].cost;
if(!pref)break;
}
}
insta[x]=false;
return flow;
} void ek(){
while(spfa())maxflow+=dfs(s,1e9);
}

分析

显然费用流,直接建图的话每一对红球和蓝球(的位置)都需要连边,一共要连\(O(N^2)\)条边,再跑费用流的话显然时间爆炸。

注意到把绝对值拆开后\((x,y)\)系数只有\(2^2\)种可能性,并且两个球的距离是这四种情况中最大值,所以我们可以对四种情况分开处理,因为我们知道一对匹配的费用取的一定是最大值,即这两个球的距离。

具体如何建图可以参考代码。

代码

#include <bits/stdc++.h>

#define rin(i,a,b) for(int i=(a);i<=(b);++i)
#define irin(i,a,b) for(int i=(a);i>=(b);--i)
#define trav(i,a) for(int i=head[a];i;i=e[i].nxt)
#define Size(a) (int)a.size()
#define pb push_back
#define mkpr std::make_pair
#define fi first
#define se second
#define lowbit(a) ((a)&(-(a)))
typedef long long LL; using std::cerr;
using std::endl; inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return x*f;
} const int MAXN=1005; int n,s,t,ecnt=1,head[MAXN<<1]; struct Edge{
int to,nxt,cap,cost;
}e[MAXN*20]; inline void add_edge(int bg,int ed,int ca,int co){
++ecnt;
e[ecnt].to=ed;
e[ecnt].nxt=head[bg];
e[ecnt].cap=ca;
e[ecnt].cost=co;
head[bg]=ecnt;
} int maxflow,cur[MAXN<<1];
LL mincost,dis[MAXN<<1];
bool book[MAXN<<1],insta[MAXN<<1];
std::queue<int> q; bool spfa(){
memset(dis,0x3f,sizeof dis);
rin(i,1,t)cur[i]=head[i];
while(!q.empty())q.pop();
dis[s]=0,book[s]=true;q.push(s);
while(!q.empty()){
int x=q.front();q.pop();
trav(i,x){
int ver=e[i].to;
if(e[i].cap&&dis[ver]>dis[x]+e[i].cost){
dis[ver]=dis[x]+e[i].cost;
if(!book[ver]){
book[ver]=true;
q.push(ver);
}
}
}
book[x]=false;
}
return dis[t]<1e18;
} int dfs(int x,int pref){
if(x==t||!pref)return pref;
int temp=0,flow=0;insta[x]=true;
for(int &i=cur[x];i;i=e[i].nxt){
int ver=e[i].to;if(insta[ver])continue;
if(dis[ver]==dis[x]+e[i].cost&&(temp=dfs(ver,std::min(pref,e[i].cap)))){
e[i].cap-=temp;
e[i^1].cap+=temp;
flow+=temp;
pref-=temp;
mincost+=1ll*temp*e[i].cost;
if(!pref)break;
}
}
insta[x]=false;
return flow;
} void ek(){
while(spfa())maxflow+=dfs(s,1e9);
} int main(){
n=read();
int x0=n*2+1,x1=x0+1,x2=x1+1,x3=x2+1;
s=x3+1,t=s+1;
rin(i,1,n){
int rx=read(),ry=read(),rc=read();
add_edge(s,i,rc,0);
add_edge(i,s,0,0);
add_edge(i,x0,1e9,rx+ry);
add_edge(x0,i,0,-rx-ry);
add_edge(i,x1,1e9,rx-ry);
add_edge(x1,i,0,-rx+ry);
add_edge(i,x2,1e9,-rx+ry);
add_edge(x2,i,0,rx-ry);
add_edge(i,x3,1e9,-rx-ry);
add_edge(x3,i,0,rx+ry);
}
rin(i,1,n){
int bx=read(),by=read(),bc=read();
add_edge(n+i,t,bc,0);
add_edge(t,n+i,0,0);
add_edge(x0,n+i,1e9,-bx-by);
add_edge(n+i,x0,0,bx+by);
add_edge(x1,n+i,1e9,-bx+by);
add_edge(n+i,x1,0,bx-by);
add_edge(x2,n+i,1e9,bx-by);
add_edge(n+i,x2,0,-bx+by);
add_edge(x3,n+i,1e9,bx+by);
add_edge(n+i,x3,0,-bx-by);
}
ek();
printf("%lld\n",-mincost);
return 0;
}

[AGC034D]Manhattan Max Matching:费用流的更多相关文章

  1. 【杂题】[AGC034D] Manhattan Max Matching【费用流】

    Description 有一个无限大的平面,有2N个位置上面有若干个球(可能重复),其中N个位置是红球,N个位置是蓝球,红球与蓝球的总数均为S. 给出2N个位置和上面的球数,现要将红球与蓝球完美匹配, ...

  2. @atcoder - AGC034D@ Manhattan Max Matching

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 考虑一个二维平面,执行共 2*N 次操作: 前 N 次,第 i ...

  3. 「AGC034D」 Manhattan Max Matching

    「AGC034D」 Manhattan Max Matching 传送门 不知道这个结论啊... (其实就是菜嘛) 首先 \(O(n^2)\) 的建边显然不太行. 曼哈顿距离有这样一个性质,如果将绝对 ...

  4. [2019多校联考(Round 6 T3)]脱单计划 (费用流)

    [2019多校联考(Round 6 T3)]脱单计划 (费用流) 题面 你是一家相亲机构的策划总监,在一次相亲活动中,有 n 个小区的若干男士和 n个小区的若干女士报名了这次活动,你需要将这些参与者两 ...

  5. BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]

    3130: [Sdoi2013]费用流 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 960  Solved: 5 ...

  6. 洛谷 1004 dp或最大费用流

    思路: dp方法: 设dp[i][j][k][l]为两条没有交叉的路径分别走到(i,j)和(k,l)处最大价值. 则转移方程为 dp[i][j][k][l]=max(dp[i-1][j][k-1][l ...

  7. bzoj4514: [Sdoi2016]数字配对--费用流

    看了一眼题目&数据范围,觉得应该是带下界的费用流 原来想拆点变成二分图,能配对的连边,跑二分图,可行性未知 后来看到另外一种解法.. 符合匹配要求的数要满足:质因子的个数相差为1,且两者可整除 ...

  8. BZOJ-3130 费用流 (听题目胡扯丶裸最大流) 二分判定+最大流+实数精度乱搞

    DCrusher爷喜欢A我做的水题,没办法,只能A他做不动的题了.... 3130: [Sdoi2013]费用流 Time Limit: 10 Sec Memory Limit: 128 MBSec ...

  9. 【TYVJ】1982 武器分配(费用流)

    http://tyvj.cn/Problem_Show.aspx?id=1982 一眼题.. 源向每个人连容量为1,费用为0的边. 每个人向一个中转节点na连容量1,费用0的边(你也可以不连,直接连后 ...

随机推荐

  1. 使用Python基于OpenCV的验证码识别

    Blog:https://blog.csdn.net/qq_40962368/article/details/89312429(Verification_Code_Identification) 步骤 ...

  2. Java Web开发技术教程入门-自定义标签

    回顾: 昨天了解了JSP开发的两种模式Model1和Model2模式.Model1采用JSP+JavaBean技术开发Web应用,它比较适合小规模应用的开发,效率较高,易于实现.但由于在Model1中 ...

  3. deepin 15.10.1 GTX1060 NVIDIA 驱动安装,双屏显示问题记录

    有一段时间没有用Linux了.由于买了个4k的戴尔显示屏,在deepin系统上无法用,从昨晚到现在,总于解决了我的问题! 问题1:无法直接在深度的显卡驱动管理器哪里直接切换,网上看到很多人都有这个问题 ...

  4. 无法发布-旧项目发布时出现:该项目中不存在目标“GatherAllFilesToPublish”。

    在项目文件夹下面找到 xxxx.csproj 文件,使用 VisualStudio Code 打开(或者任意编辑器,VisualStudio 可能无法编辑) 将以下节点进行更改 <Import ...

  5. Abp添加新的接口(扩展底层接口)

    在https://aspnetboilerplate.com/Templates 创建项目之后,下载用Vs2019打开(vs2017不支持netcore3.0)结构如下: 一. 2. 在xx.core ...

  6. wpf ActualWidth为0解决方法

    LocalNewsControl() { var descriptor = DependencyPropertyDescriptor.FromProperty(ActualWidthProperty, ...

  7. loj 6043「雅礼集训 2017 Day7」蛐蛐国的修墙方案

    loj 爆搜? 爆搜! 先分析一下,因为我们给出的是一个排列,然后让\(i\)给\(p_i\)连边,那么我们一定会得到若干个环,最后要使得所有点度数为1,也就是这些环有完备匹配,那么最后一定全是偶环. ...

  8. MySql查询进阶

    1.1 as关键字 用于 给显示结果中字段 或者 表 起别名 select 别名.字段名 from 表名 as 别名 where 条件语句 # 对字段起别名 select id as '编号', na ...

  9. Linux Exploit系列之七 绕过 ASLR -- 第二部分

    原文地址:https://github.com/wizardforcel/sploitfun-linux-x86-exp-tut-zh/blob/master/7.md 这一节是简单暴力的一节,作者讲 ...

  10. 自己实现一个简化版Mybatis框架

    MyBatis框架的核心功能其实不难,无非就是动态代理和jdbc的操作,难的是写出来可扩展,高内聚,低耦合的规范的代码.本文完成的Mybatis功能比较简单,代码还有许多需要改进的地方,大家可以结合M ...