价值即等价于给每一个点系数$p_{i}=\pm 1$,使得$\forall (x,y)\in E,p_{x}=p_{y}$的最大的$\sum_{i=1}^{n}p_{i}b_{i}$

如果没有删除(当然可以直接求绝对值),考虑网络流建图:将$b_{i}$分为正负两类,$S$向正的连$2b_{i}$的边,负的向$T$连$-2b_{i}$的边,将图中直接相连的两点连上流量为$\infty$的边,那么若两点不同向,则必须有一个被割掉

考虑删除,可以看作这个这个点不要求正负,同时其也不会帮助连边,因此将一个点拆开,并建$(i,i+n)$一条$a_{i}+|b_{i}|$的边表示删去这个点所付出的代价

同时对于一条边,连$(x+n,y)$和$(y+n,x)$,此时若$(x,x+n)$被删掉,则无法通过$x$走到$y+n$,即实现不帮助连边

最终答案即$\sum_{i=1}^{n}|b_{i}|-最小割$,时间复杂度为$o(n^{3

  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 #define N 605
  4. 4 #define oo 0x3f3f3f3f
  5. 5 struct ji{
  6. 6 int nex,to,len;
  7. 7 }edge[N<<2];
  8. 8 queue<int>q;
  9. 9 int E,n,m,x,y,ans,head[N],a[N],work[N],d[N];
  10. 10 void add(int x,int y,int z){
  11. 11 edge[E].nex=head[x];
  12. 12 edge[E].to=y;
  13. 13 edge[E].len=z;
  14. 14 head[x]=E++;
  15. 15 if (E&1)add(y,x,0);
  16. 16 }
  17. 17 bool bfs(){
  18. 18 memset(d,oo,sizeof(d));
  19. 19 q.push(0);
  20. 20 d[0]=0;
  21. 21 while (!q.empty()){
  22. 22 int k=q.front();
  23. 23 q.pop();
  24. 24 for(int i=head[k];i!=-1;i=edge[i].nex)
  25. 25 if ((edge[i].len)&&(d[edge[i].to]==oo)){
  26. 26 d[edge[i].to]=d[k]+1;
  27. 27 q.push(edge[i].to);
  28. 28 }
  29. 29 }
  30. 30 return d[2*n+1]!=oo;
  31. 31 }
  32. 32 int dfs(int k,int s){
  33. 33 if (k>2*n)return s;
  34. 34 for(int &i=work[k];i!=-1;i=edge[i].nex)
  35. 35 if ((edge[i].len)&&(d[edge[i].to]==d[k]+1)){
  36. 36 int p=dfs(edge[i].to,min(s,edge[i].len));
  37. 37 if (p){
  38. 38 edge[i].len-=p;
  39. 39 edge[i^1].len+=p;
  40. 40 return p;
  41. 41 }
  42. 42 }
  43. 43 return 0;
  44. 44 }
  45. 45 int dinic(){
  46. 46 int k,ans=0;
  47. 47 while (bfs()){
  48. 48 memcpy(work,head,sizeof(head));
  49. 49 while (k=dfs(0,oo))ans+=k;
  50. 50 }
  51. 51 return ans;
  52. 52 }
  53. 53 int main(){
  54. 54 scanf("%d%d",&n,&m);
  55. 55 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
  56. 56 memset(head,-1,sizeof(head));
  57. 57 for(int i=1;i<=n;i++){
  58. 58 scanf("%d",&x);
  59. 59 ans+=abs(x);
  60. 60 add(i,i+n,abs(x)+a[i]);
  61. 61 if (x>=0)add(0,i,2*x);
  62. 62 else add(i+n,2*n+1,-2*x);
  63. 63 }
  64. 64 for(int i=1;i<=m;i++){
  65. 65 scanf("%d%d",&x,&y);
  66. 66 add(x+n,y,oo);
  67. 67 add(y+n,x,oo);
  68. 68 }
  69. 69 printf("%d",ans-dinic());
  70. 70 }

[atARC107F]Sum of Abs的更多相关文章

  1. LeetCode_3 sum closet

    Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...

  2. Minimum Sum(思维)

    Problem 1603 - Minimum Sum Time Limit: 2000MS   Memory Limit: 65536KB    Total Submit: 563  Accepted ...

  3. leetcode16—3 Sum Closet

    Given an array nums of n integers and an integer target, find three integers in nums such that the s ...

  4. Whu 1603——Minimum Sum——————【单个元素贡献、滑窗】

    Problem 1603 - Minimum Sum Time Limit: 2000MS   Memory Limit: 65536KB   Total Submit: 623  Accepted: ...

  5. ABS函数 去掉金额字段值为负数问题

    )) from OrderDetail

  6. Leetcode分类刷题答案&心得

    Array 448.找出数组中所有消失的数 要求:整型数组取值为 1 ≤ a[i] ≤ n,n是数组大小,一些元素重复出现,找出[1,n]中没出现的数,实现时时间复杂度为O(n),并不占额外空间 思路 ...

  7. Leetcode 16. 3Sum Closest

    Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...

  8. 45 个非常有用的 Oracle 查询语句

    ​ 这里我们介绍的是 40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询.这些是所有 Oracle 开发者都必备的技能,所以快 ...

  9. Color Transfer between Images code实现

    上计算机视觉课老师布置的作业实现论文:Color Transfer between Images 基本思路是: 1.给定srcImg和targetImg 2.将RGB空间转为Lab空间 3.根据论文中 ...

随机推荐

  1. asp.net core使用identity+jwt保护你的webapi(二)——获取jwt token

    前言 上一篇已经介绍了identity在web api中的基本配置,本篇来完成用户的注册,登录,获取jwt token. 开始 开始之前先配置一下jwt相关服务. 配置JWT 首先NuGet安装包: ...

  2. 基于querybuilder的可根据现有数据表自动生成Restful API的dotnet中间件

    AutoApi 基于SqlKata Query Builder的可根据数据表自动生成Restful API的dotnet中间件 项目地址 Github Gitee 支持的数据库 MySql AutoA ...

  3. Linux系统安装MySql5.7并通过sql脚本导入数据

    为了下载到的MySQL版本和目标系统相互兼容,在开启之前,最好了解目标系统的相关信息. 查询系统版本: cat /etc/issue 查看系统位数 getconf LONG_BIT 选择MySQL 根 ...

  4. Flutter随笔(二)——使用Flutter Web + Docker + Nginx打造一个简单的Web项目

    前言 Flutter作为一个跨平台UI框架,功能十分强大,仅用一套代码便能编译出Android.iOS.Web.windows.macOS.Windows.Linux等平台上的应用,各平台应用体验高度 ...

  5. Protocol handler start failed

    问题描述: 启动项目的时候出现的中文大体意思是:协议处理程序启动失败看着这个启动失败,下意识就想是不是端口占用了,结果换个端口还是不行,于是百度了一个办法 问题解决: 打开任务管理器,找到Java的后 ...

  6. Win10开启剪贴板

    点击任务栏下方右侧的会话窗口 点击所有设置 在搜索栏中输入剪贴板,点击进入剪贴板设置 开启剪贴板历史记录 按下组合键win + v即可呼出剪贴板

  7. C 函数指针 函数指针数组 转移表

    内容来自<c和指针>,整理后方便个人理解 高级声明 cdel程序可以方便的给出声明的释义 指向函数的指针 int ( *f ) ( int n_values, float amount ) ...

  8. fastjson反序列化-JdbcRowSetImpl利用链

    fastjson反序列化-JdbcRowSetImpl利用链 JdbcRowSetImpl利用链 fastjson反序列化JdbcRowSetImpl - Afant1 - 博客园 (cnblogs. ...

  9. Go语言核心36讲(Go语言进阶技术三)--学习笔记

    09 | 字典的操作和约束 至今为止,我们讲过的集合类的高级数据类型都属于针对单一元素的容器. 它们或用连续存储,或用互存指针的方式收纳元素,这里的每个元素都代表了一个从属某一类型的独立值. 我们今天 ...

  10. 安卓开发——WebView+Recyclerview文章详情页,解决高度问题

    安卓开发--WebView+Recyclerview文章详情页,解决高度问题 最近在写一个APP时,需要显示文章详情页,准备使用WebView和RecyclerView实现上面文章,下面评论.出现了W ...