题目链接

https://atcoder.jp/contests/agc034/tasks/agc034_d

题解

降智了没想出来建图……(不过这场是真的DE放反了)
注意到曼哈顿距离有一个重要的性质: 合法的最大,也就是对于任意维数两个点的曼哈顿距离而言,假设我们把每个绝对值符号任意地改变成正号或者负号,那么合法的(实际的)曼哈顿距离是这所有值里最大的。证明显然。
那么既然我们求的是最大距离和,就可以忽略合不合法的问题,四种拆绝对值的方法不对连接的两个点的坐标有要求。
考虑费用流建图,建两排点分别表示两种球,然后在中间建四个点代表四种匹配方式,两边的每个点和中间的每个点连对应匹配方式的权值,求最大费用最大流即可。
时间复杂度\(O(MFMC(n,10n))\), 似乎费用流算法的复杂度可以被估计为\(O(mC\log m)\)其中\(C\)为最大流量,而这里最大流量是\(O(S)\)的,故复杂度\(O(nS\log n)\).
题解里说可以模拟费用流做到\(O(S\log n)\)... 瑟瑟发抖

代码

#include<bits/stdc++.h>
#define llong long long
#define mkpr make_pair
#define riterator reverse_iterator
using namespace std;inline int read()
{int x = 0,f = 1; char ch = getchar();for(;!isdigit(ch);ch=getchar()) {if(ch=='-') f = -1;}for(; isdigit(ch);ch=getchar()) {x = x*10+ch-48;}return x*f;
}const llong INF = 1e12;namespace NetFlow
{const int N = 2006;const int M = 10000;struct AEdge{int u,v,wl,wr; llong c;} ae[M+3];struct Edge{int u,v,nxt,w; llong c;} e[(M<<1)+3];int fe[N+3];llong dis[N+3];int que[N+5];bool inq[N+3];int lst[N+3];int n,m,en,s,t; llong mf,mc;void addedge(int u,int v,int w,llong c){
//      printf("addedge %d %d %d %lld\n",u,v,w,c);en++; e[en].u = u,e[en].v = v,e[en].w = w,e[en].c = c;e[en].nxt = fe[u]; fe[u] = en;en++; e[en].u = v,e[en].v = u,e[en].w = 0,e[en].c = -c;e[en].nxt = fe[v]; fe[v] = en;}bool spfa(){for(int i=1; i<=n; i++) dis[i] = -INF;int hd = 1,tl = 2; que[1] = s; dis[1] = 0;while(hd!=tl){int u = que[hd]; hd++; if(hd>n+1) hd-=n+1;for(int i=fe[u]; i; i=e[i].nxt){int v = e[i].v;if(e[i].w>0&&dis[e[i].v]<dis[u]+e[i].c){dis[e[i].v] = dis[u]+e[i].c; lst[e[i].v] = i;if(!inq[e[i].v]){inq[e[i].v] = true;que[tl] = e[i].v; tl++; if(tl>n+1) tl-=n+1;}}}inq[u] = false;}return dis[t]!=-INF;}void calcflow(){int flow = 1e5;for(int u=t; u!=s; u=e[lst[u]].u){flow = min(flow,e[lst[u]].w);}for(int u=t; u!=s; u=e[lst[u]].u){e[lst[u]].w -= flow; e[lst[u]^1].w += flow;}mf += flow; mc += 1ll*flow*dis[t];}llong mfmc(int _n,int _s,int _t){n = _n,s = _s,t = _t; mf = 0,mc = 0ll;while(spfa()) {calcflow();} return mc;}
}
using NetFlow::addedge;const int N = 1000;
struct Point
{int x,y,cnt;
} a[N+3],b[N+3];
int n;int main()
{NetFlow::en = 1;scanf("%d",&n);for(int i=1; i<=n; i++) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].cnt);for(int i=1; i<=n; i++) scanf("%d%d%d",&b[i].x,&b[i].y,&b[i].cnt);for(int i=1; i<=n; i++){addedge(1,i+6,a[i].cnt,0);addedge(i+6,3,a[i].cnt,-a[i].x-a[i].y);addedge(i+6,4,a[i].cnt,-a[i].x+a[i].y);addedge(i+6,5,a[i].cnt,a[i].x-a[i].y);addedge(i+6,6,a[i].cnt,a[i].x+a[i].y);}for(int i=1; i<=n; i++){addedge(i+n+6,2,b[i].cnt,0);addedge(3,i+n+6,b[i].cnt,b[i].x+b[i].y);addedge(4,i+n+6,b[i].cnt,b[i].x-b[i].y);addedge(5,i+n+6,b[i].cnt,-b[i].x+b[i].y);addedge(6,i+n+6,b[i].cnt,-b[i].x-b[i].y);}llong ans = NetFlow::mfmc(n+n+6,1,2);printf("%lld\n",ans);return 0;
}

AtCoder AGC034D Manhattan Max Matching (费用流)相关推荐

  1. AtCoder AGC034D Manhattan Max Matching (网络流)

    题目链接 https://atcoder.jp/contests/agc034/tasks/agc034_d 题解 降智了没想出来建图--(不过这场是真的DE放反了) 注意到曼哈顿距离有一个重要的性质 ...

  2. AtCoder AGC031E Snuke the Phantom Thief (费用流)

    题目链接 https://atcoder.jp/contests/agc031/tasks/agc031_e 题解 做法一(我的做法) 这是我yy出来的一个上下界费用流做法,自己没找到什么反例,能过. ...

  3. 费用流 -- 四川省赛F-Direction Setting [拆边成点+费用流]

    题目链接 题目大意: 就是给你一个nnn个点mmm条边的无向图,每个点有个值是aia_iai​现在你把每条边都赋予一个方向之后这个图就是有向图了,那么设第iii个点的入度是did_idi​,现在设 D ...

  4. POJ 2135 Farm Tour amp;amp; HDU 2686 Matrix amp;amp; HDU 3376 Matrix Again 费用流求来回最短路...

    累了就要写题解,近期总是被虐到没脾气. 来回最短路问题貌似也能够用DP来搞.只是拿费用流还是非常方便的. 能够转化成求满流为2 的最小花费.一般做法为拆点,对于 i 拆为2*i 和 2*i+1.然后连 ...

  5. 【BZOJ】1834: [ZJOI2010]network 网络扩容(最大流+费用流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1834 我又思考人生了T_T,nd的数组开小了,一直wa,调了一个小时才发现啊!!!!!我一直以为我的 ...

  6. Gym 101190D BZOJ 4842 Luogu P6967 LOJ #6071 [NEERC2016]Delight for a Cat (费用流)

    题目链接 (BZOJ) 大人,时代变了 (Gym) https://codeforces.com/gym/101190 (Luogu) https://www.luogu.com.cn/problem ...

  7. 【bzoj3280】小R的烦恼 费用流

    题目描述 小R最近遇上了大麻烦,他的程序设计挂科了.于是他只好找程设老师求情.善良的程设老师答应不挂他,但是要求小R帮助他一起解决一个难题. 问题是这样的,程设老师最近要进行一项邪恶的实验来证明P=N ...

  8. 洛谷 - P4014 分配问题(费用流/KM)

    题目链接:点击查看 题目大意:给出n个工人和n个工作,每个人做每一个工作的效率都是不同的,问如何分配能让效率最低/最高 题目分析:最小费用最大流和最大费用最大流的模板题,直接套模板跑答案就行了,没有任 ...

  9. 【学习笔记】线性规划与对偶问题和LP对偶费用流([ZJOI2013]防守战线题解)

    线性规划与对偶问题 原问题: min⁡{7x1+x2+5x3}s.t.{x1−x2+3x3≥105x1+2x2−x3≥6xi≥0\min\{7x_1+x_2+5x_3\} \\ s.t.\begin{ ...

最新文章

  1. 混合线性模型+mixed linear model+GEEs+GLMM+LMM
  2. 【建站系列教程】2.3、分享一些小说的api接口
  3. [转]30个HTML5学习资源
  4. ylb:创建数据库、表,对表的增查改删语句
  5. git commit 提交的时候报错husky > pre-commit hook failed 或者‘lint-staged‘ 不是内部或外部命令,也不是可运行的程序(解决办法)
  6. LeetCode题库整理【Java】—— 7整数反转
  7. Android RxJava和改造
  8. 手把手教你搭建FastDFS集群(中)
  9. IP地址归属地和手机号码归属地批量查询(单次支持500个以内,支持结果导出xls)
  10. 获取当前经纬度 和 通过经纬度 得到大致位置的接口
  11. dp题目总结(1)——基础
  12. Keras:使用预训练模型迁移学习单通道灰度图像
  13. spark idea报错:json standard allows only one-top level
  14. PC3000可恢复的SSD固态硬盘支持列表
  15. C语言怎么打出泊松分布随机数,泊松分布随机数
  16. Android适合手机开发的又一力证——安卓街机
  17. tuxera NTFS2022让磁盘读写管理格式化更轻松
  18. Windows 2003 下 SquirrelMail 的安装
  19. 第十一届蓝桥杯——JAVA组真题
  20. 计算机如何启动远程服务,Win7如何开启远程桌面服务

热门文章

  1. 云炬Android开发笔记 3-3基础框架可用性验证
  2. 干货 | 126 篇 AI 原创文章精选(ML、DL、资源、教程)
  3. Spatial Pyramid Pooling(空间金字塔池化)-变尺度CNN训练
  4. OpenGL编程指南12:光照_渲染真实球体
  5. Qt修炼手册5_文件输入输出
  6. 将输出的数据按照表格的形式进行输出
  7. 计算机网络各层代表设备
  8. Java中super函数的用法
  9. eclipse忘记了程序保存在哪里怎么办
  10. html文件传递中文参数到flex中产生的中文乱码问题