首页 > 其他分享 >ABC214H Collecting 题解

ABC214H Collecting 题解

时间:2023-10-12 22:25:24浏览次数:46  
标签:Collecting infty DAG bel limits 题解 sum ABC214H forall

前言

这是一道比较神仙的题目,其后半部分的建图是比较困难想到的,前半部分还是较为容易的。

题意

现在有一张\(N\)个点\(M\)条边的有向图,每个点有一个点权\(a_i\),现在要找出\(K\)条路径,使得这些路径的并集的点权和尽量大。现在求出点权和。

\(N, M \le 2\times 10^5, k \le 10\)

题解

缩成DAG

首先我们先用缩点将原图缩成一张DAG,因为一个人可以只用一次走过一个强连通分量(SCC),这一点是显然的。

下文中,我们设\(n^{'}\)为缩完点后的DAG的大小,\(b_i\)表示第\(i\)个SCC的权值总和,用\(bel_i\)表示节点\(i\)在DAG中对应的强连通分量的编号。

并且惯用图论中的\(V\)表示DAG的点集,\(E\)表示DAG的边集。

缩小数据范围

我们先不妨缩小一下数据范围,考虑一下\(\mathcal{O}(KMN)\)的做法。这一部分的做法还是比较显然的。根据常见的套路,我们会把点权拆点边成边权,然后在根据题目具体进行连边。那么,我们不妨可以这样连边:

  • \(\forall u \in V, (u, u^{'}, 1, b_u), (u, u^{'}, +\infty, 0)\) 这一部分对应拆点建边
  • \(\forall (u, v) \in E, (s^{'}_u, s_v, +\infty, 0)\) 边不会产生贡献
  • \((S, bel_1, K, 0)\),表示所有人都要从\(bel_1\)点出发
  • \(\forall u \in V, (u^{'}, T, +\infty, 0)\),代表着任何点都可以作为重点

然后我们对这个东西跑最大费用最大流。只需在最小费用最大流上将费用取反即可。

现在我们已经做出了一种\(\mathcal{O}(KMN)\)的做法。

解决原题

现在我们想要从算法上解决问题。然后我们发现了一种叫 Primal-Dual Method的算法。个人理解是核心在于维护一个势能函数\(h\),和HLPP感觉有异曲同工之妙。

这里是详细的

不过我们非常惊喜的发现这个东西要求费用为正。这显然非常好处理,我们记录损失了多少权值。然后连边就变成了:

  • \(\forall u \in V, (u, u^{'}, 1, 0), (u, u^{'}, +\infty, b_u)\)
  • \(\forall (u, v) \in E, (s^{'}_u, s_v, +\infty, \sum \limits_{i=u + 1}^{v - 1} b_i)\)
  • \((S, bel_1, K, \sum \limits_{i=1}^{bel_1 - 1}b_i)\)
  • \(\forall u \in V, (u^{'}, T, +\infty, \sum \limits_{i=u + 1}^{T}b_i)\)

这个就变成了最小费用最大流,跑一遍以后,答案即为\(K \times \sum \limits_{i=1}^{n}a_i-\text{mincost}\)

显然\(\sum \limits_{i=1}^{n}a_i = \sum \limits_{i \in V}b_i\),所以其实本事是一样的

然后呢,代码就没必要放了,我全都用的是atcoder/sccatcoder/mincostflow的东西。这边强烈建议使用,这样就不用再写一遍tarjan/kosarajuMCMF了(手动狗头)

标签:Collecting,infty,DAG,bel,limits,题解,sum,ABC214H,forall
From: https://www.cnblogs.com/georgeyucjr/p/17760731.html

相关文章

  • POD 题解
    考虑每种颜色都只在一条链上出现这个限制。考虑使用随机化\(\text{hash}\),我们对每个点随机一个权值,使得每种颜色所有点异或值为\(0\)。这样一种颜色如果只在一条链上,那对两条链\(\text{hash}\)异或值的贡献就是\(0\),否则就是两个随机值。这样如果存在一个颜色存在于两条......
  • CF938F Erasing Substrings 题解
    ErasingSubstrings一个神奇的想法是设\(f_{i,j}\)表示在位置\([1,i]\)中,我们删去了长度为\(2^k(k\inj)\)的一些串,所能得到的最小字典序。使用二分加哈希可以做到\(O(n^2\log^2n)\),无法承受。发现对于状态\(f_{i,j}\),它已经确定了\(i-j\)位的串,因为所有\(\inj\)......
  • [AGC030F] Permutation and Minimum 题解
    PermutationandMinimum看到300的数据范围,再加上计数题,很容易就往计数DP方向去想。为方便,我们将\(n\)乘二。因为是两个位置取\(\min\),于是我们便想到从小往大把每个数填入序列。于是DP数组第一维的意义便出来了:当前已经填入了前\(i\)小个数。考虑当前填入一个数。这......
  • 洛谷P3576 [POI2014] MRO-Ant colony 题解
    MRO-Antcolony根据下取整除法的性质\((\left\lfloor\dfrac{\left\lfloor\dfrac{x}{y}\right\rfloor}{z}\right\rfloor=\left\lfloor\dfrac{x}{yz}\right\rfloor)\),我们可以反向考虑,即从特殊边开始,计算出从每个叶子到特殊边的路径上,要除以的那个分母是什么。这个可以直接一遍df......
  • 洛谷P3713 [BJOI2017] 机动训练 题解
    机动训练这题的瓶颈,在于把\(a_i^2\)看作\(\sum\limits_{i=1}^{a_i}\sum\limits_{j=1}^{a_i}1\),然后我们就可以看成“两两相同的机动路径都能贡献1”。于是我们设\(f_{x1,y1,x2,y2}\)表示两条起点为\((x1,y1)\)和\((x2,y2)\)的相同路径的数量,然后分别枚举两条路径的方向......
  • [AGC013E] Placing Squares 题解
    PlacingSquares关键是将问题从抽象的“正方形面积”转为具象的形式:一段长度为\(d\)的区间,有两个不同的小球要放进去,则总放置方案就是\(d^2\),且不同的区间间方案是通过乘法原理结合的,刚好是题目中\(\prodd^2\)的形式。于是我们可以设计DP:设\(f_{i,j}\)表示前\(i\)个......
  • 洛谷P3118 [USACO15JAN] Moovie Mooving G 题解
    MoovieMoovingG设\(f[i][S]\)表示在第\(i\)场(注意是场,不是部)电影时,已经看了\(S\)里面的电影是否合法。然后贪心地取\(|S|\)最小的状态保存。光荣MLE了,\(21\%\)。发现当一场电影结束后,无论这一场是在哪里看的都没关系。因此我们设\(f[S]\)表示只看集合\(S\)里......
  • CF908D New Year and Arbitrary Arrangement 题解
    NewYearandArbitraryArrangement思路:期望题果然还是恶心呀!我们设\(f[i][j]\)表示当串中有\(i\)个\(a\)和\(j\)个\(ab\)时的方案数。为了方便,设\(A=\dfrac{P_a}{P_a+P_b},B=\dfrac{P_b}{P_a+P_b}\)。显然,可以这样转移:\[f[i][j]=f[i+1][j]\timesA+f[i][i+j]\ti......
  • CF264B Good Sequences 题解
    GoodSequences状态很显然,设\(f[i]\)表示位置\(i\)的最长长度。关键是转移,暴力转移是\(O(n^2)\)的,我们必须找到一个更优秀的转移。因为一个数的质因子数量是\(O(\logn)\)的,而只有和这个数具有相同质因子的数是可以转移的;因此我们可以对于每个质数\(p\),设一个\(mx_p......
  • 题解 AtCoder wtf22_day1_b【Non-Overlapping Swaps】
    题解AtCoderwtf22_day1_b【Non-OverlappingSwaps】problem给定一个排列,要求交换最多\(n-1\)对元素,使得这个排列变成[1,2,...,n]的有序排列。当然没有那么简单,对于交换还是有限制的,对于相邻的两次交换,不妨叫做\((l_i,r_i)\)和\((l_{i+1},r_{i+1})\),必须满足这两个交......