题目链接
题意就是给定一个无向图,每个点有权值ai,bia_i,b_iai​,bi​,现在需要删去其中的一些点,其中删去一个点的花费为aia_iai​,删点后的图的分数为每一个联通块的分数之和,一个联通块的分数是这个联通块的点的bib_ibi​的和的绝对值。要求删点后的图的分数减去删点的花费的最大值(n,m<=300n,m<=300n,m<=300)
很妙的最小割题
对于一个联通块,取绝对值之后就是这个联通块内的所有点的和乘上+1或者-1
这样我们就可以考虑给每一个没有删去的点赋上一个额外的值为+1或-1,其中+1和-1不能相邻因为一个联通块内的所有点的权值都是+1或者-1,然后我们要求其中的最小值。
事实上,我们可以先求所有的bib_ibi​的绝对值的和sumsumsum,这样对于点iii,删去它或者给这个点赋上+1或者-1的代价分别是:
如果bi>0b_i>0bi​>0,则删点、赋为+1,-1的代价分别为:ai+bi,0,2bia_i+b_i,0,2b_iai​+bi​,0,2bi​
如果bi<0b_i<0bi​<0,则删点、赋为+1,-1的代价分别为:ai−bi,−2bi,0a_i-b_i,-2b_i,0ai​−bi​,−2bi​,0
仔细想想都比较容易得到,这里举bi<0b_i<0bi​<0,赋值为+1的情况为例,原本我们已经求得了所有bib_ibi​的绝对值的和,相当于对此时的bib_ibi​取了权值为−1-1−1,而实际上我们应该取+1,所以我们的代价就是原本最初加进去的∣bi∣|b_i|∣bi​∣和要取+1时的−bi-b_i−bi​,故为−2bi-2b_i−2bi​
转化为这个问题之后其实可以用最小割来解决。我们可以这样连边:先拆点,然后每个点S到i连一条流量为这个点赋值+1的代价的边,i到i’连接一条流量为删去这个点的代价的边,i’到T连接一条流量为这个点赋值-1的代价的边。对于原本在图上的一条边(u,v),我们在u’到v和v’到u分别连接一条流量为inf的边。这样求最小割即可。
大概原理:

对于u到v这条边中,要么删去其中一个点,要么不能同时选择+1或者-1,对应着在图上割就可以了
代码:

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=610,M=2410;
int n,m,S,T,ans,tot=1,a[N],b[N],cur[N],head[N],to[M],nxt[M],val[M],dep[N];
void add_edge(int u,int v,int w){nxt[++tot]=head[u];to[tot]=v;val[tot]=w;head[u]=tot;return;
}
void Add_edge(int u,int v,int w){add_edge(u,v,w);add_edge(v,u,0);return;
}
bool bfs(){queue<int>q;q.push(S);for(int i=1;i<=T;i++){dep[i]=-1;cur[i]=head[i];}dep[S]=1;while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];~i;i=nxt[i]){int v=to[i];if(!val[i]||~dep[v])continue;dep[v]=dep[u]+1;q.push(v);}}return ~dep[T];
}
int dfs(int u,int now){if(u==T||!now)return now;int ret=0;for(int &i=cur[u];~i;i=nxt[i]){int v=to[i];if(dep[v]!=dep[u]+1||!val[i])continue;int dist=dfs(v,min(now,val[i]));if(dist){val[i]-=dist;now-=dist;val[i^1]+=dist;ret+=dist;}}return ret;
}
void Dinic(){while(bfs())ans-=dfs(S,0x7f7f7f7f);return;
}
int main(){memset(head,-1,sizeof(head));scanf("%d%d",&n,&m);S=(n<<1|1),T=S+1;for(int i=1;i<=n;i++)scanf("%d",a+i);for(int i=1;i<=n;i++){scanf("%d",b+i);if(!b[i])Add_edge(i,i+n,a[i]);if(b[i]<0){ans-=b[i];Add_edge(S,i,-b[i]*2);Add_edge(i,i+n,a[i]-b[i]);}if(b[i]>0){ans+=b[i];Add_edge(i+n,T,b[i]*2);Add_edge(i,i+n,a[i]+b[i]);}}for(int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);Add_edge(v+n,u,2e9);Add_edge(u+n,v,2e9);}Dinic();printf("%d\n",ans);return 0;
}

AtCoder Regular Contest 107 F - Sum of Abs(网络流最小割)相关推荐

  1. AtCoder题解——AtCoder Regular Contest 107——B - Quadruple

    题目相关 题目链接 AtCoder Regular Contest 107 B 题,https://atcoder.jp/contests/arc107/tasks/arc107_b. Problem ...

  2. AtCoder Regular Contest 067 F - Yakiniku Restaurants

    题意: 有n个餐厅排成一排,第i个与第i+1个之间距离是Ai. 有m种食物,每种食物只能在一个餐厅里吃,第j种食物在第i个餐厅里吃的收益是$b[i][j]$. 选择每种食物在哪个餐厅里吃,使收益减去走 ...

  3. AtCoder Regular Contest 107 B - Quadruple(数学+思维)

    题目链接:https://atcoder.jp/contests/arc107/tasks/arc107_b 给出两个数,n,k,现在有四个数,1<=a,b,c,d<=n ,要求满足等式 ...

  4. AtCoder Regular Contest 085 F NRE 线段树优化dp

    题意 有长度为n初始全为0的数组A和仅由0和1组成的数组B.现在给出m个区间,每次可以选择某个区间[l,r],使得A数组下标在[l,r]之间的元素变为1.问A和B最小不同位置数量是多少. n,m< ...

  5. 【arc075f】AtCoder Regular Contest 075 F - Mirrored

    题意 给定一个数x,问有多少个正整数y,使得rev(y)-y==x 其中rev(x)表示x按位翻转之后得到的数. x<=1e9 做法 首先通过打表发现,这个答案不会很大. 这就说明解相当地松弛. ...

  6. AtCoder Regular Contest 107 B - Quadruple

    思路: 可以设 x = a + b , y = c + d x=a+b,y=c+d x=a+b,y=c+d,那么问题就转换为了 x = k + y x=k+y x=k+y. 限制条件就是 2 ≤ x ...

  7. AtCoder Regular Contest 065

    AtCoder Regular Contest 065 C - Daydream Score : 300300300 points 倒着来就行了,正着来会产生歧义匹配,dreamer,dreamdre ...

  8. AtCoder Regular Contest 100 D - Equal Cut 思维 + 前缀和

    传送门 文章目录 题意: 思路: 题意: 给你一个数组aaa,你要将其分成四份,让这四份中和的最大值−-−最小值最小,输出这个最小值. n≤2e5,ai≤1e9n\le2e5,a_i\le1e9n≤2 ...

  9. NOMURA Programming Contest 2021(AtCoder Regular Contest 121)

    文章目录 A - 2nd Greatest Distance B - RGB Matching C - Odd Even Sort D - 1 or 2 E - Directed Tree F - L ...

最新文章

  1. C++中的命名空间namespace
  2. 彻底理解乐观锁和悲观锁的区别
  3. 使用 Arthas 排查开源 Excel 组件问题
  4. Lucene6去掉了Filter但是可以用BooleanQuery实现Filter查询
  5. ASP.NET系列:自定义配置节点的复用
  6. excel数据命令导入mysql_如何将EXCEL数据导入MYSQL
  7. Python hasattr() getattr() setattr() 函数使用
  8. python中seth是啥意思_python中的seth是什么意思
  9. 机器学习--详解基于梯度下降的Logistic回归算法原理
  10. unity现代人物含代码动画_Unity Animation--动画系统概述
  11. 计算机桌面成英文怎样变成中文版,电脑系统菜单全变成英文怎么办
  12. 3d打印零件精度的影响
  13. java 填充图片_java图片缩放实现图片填充整个屏幕
  14. 来,给产品狗起个正儿八经的名字!
  15. BZOJ2794: [Poi2012]Cloakroom【偏序+背包】
  16. 图像处理中的一阶偏导和二阶偏导
  17. 教程篇(7.0) 04. FortiGate安全 NAT ❀ Fortinet 网络安全专家 NSE 4
  18. LTDC-DMA2D显示屏显示-编码标准(三)
  19. 使用Docker Compose构建ZigBee基础架构
  20. 【SQL】查找重复的数据

热门文章

  1. 【2021年新书推荐】Red Hat RHCSA 8 Cert Guide: EX200
  2. 生态 | 战略签约,人大金仓携手同联公司签署战略协议共同开创信息化创新发展新篇章!...
  3. 常用网站推广技巧和方法
  4. darkstartopaz 的done疑惑……
  5. vsftpd虚拟用户权限设置
  6. matlab 整局-部视知觉实验(读取excel点阵设计图替换数据)
  7. jetcache自动刷新缓存
  8. Vue.js系列之入门手册整理
  9. 重置电脑与重装系统比较
  10. Fel表达式计算引擎学习