loading...

[CF1430G]Yet Another DAG Problem

Edu 的题,tql!

链接

Description

\(n\) 个点,\(m\) 条边组成的 DAG,每条边有边权 \(w_i\),从 \(u_i\) 连向 \(v_i\)。为每个点设立点权 \(a_i\),对每个 \(1\le i\le m\) 计算 \(b_i=a_{u_i}-a_{v_i}\)。必须满足以下条件:

  1. \(b_i > 0\)

  2. 在满足 1. 条件下,使得 \(\displaystyle\sum_{i=1}^{m}w_ib_i\) 尽量小。

\(1\le n \le 18\)\(1\le m \le \dfrac{n(n-1)}{2}\)\(1\le w_i \le 10^5\)\(u_i \neq v_i\)

Hint 1

一个 simple 的观察是:可以把 \(\displaystyle \sum _{i=1}^m w_ib_i\) 替换为 \(\displaystyle \sum _{i=1}^nc_ia_i\),其中 \(c_i\) 表示所有出边的边权和减去入边的边权和。这是最难的 Hint!gm 老师唯一讲出来的一条!

Hint 2

Yet another simple 的观察是:一定存在满足 \(1\le a_i \le n\) 的解满足条件。因为若存在一个 \(a_i\) 使得没有 \(a_j=a_i-1\),那么这个 \(a_i\) 一定可以减去 \(1\),这样能继续满足条件,但是 \(\displaystyle \sum _{i=1}^m w_ib_i\) 一定会减小。所以,不会存在一组解满足 \(a_i,a_j\),使得 \(a_i \ge a_j+n\),因此全部减去/加上同一个值一定可以得到 \(1 \le a_i \le n\) 的解。

Solution 1

根据 Hint,再根据 \(n\) 的范围,很容易想到状压 \(\rm DP\)死去的记忆突然复活,开始攻击我。

定义 \(f_{x,S}\) 表示已经规划好了 \(i \in S\)\(a_i\) 值且 \(a_i \in [1,x]\)\(\displaystyle\sum_{i \in S}^{}c_ia_i\) 的最小值。

\[f_{x, S}=\min_{T\subset S} \left\{f_{x-1, T}+x \sum _{i\in\complement_{S}T}^{}c_i\right\} \]

子集枚举总共是 \(\mathcal O(3^n)\),总时间复杂度 \(\mathcal O(n2^n+3^n)\)。这样复杂度较高,可以用官方题解的做法降至 \(\mathcal O(n^22^n+n2^n)\)

Solution 2

从头开始想最小割建模。

最小割会将网络分为 \(S,T\) 两个集合。

建出虚拟源汇点 \(s,t\),把每个点拆成 \(n\) 个点的链,总共会有 \((x,i)\)。为叙述方便,我们用 \((x,i)\) 表示 \(x\) 链上第 \(i\) 个点,它会作为一个点出现在网络中,钦定 \((x,0)=s\)。最小割断开一条边 \((x,i-1)\to (x,i)\),表示选择 \(a_x=i\)

  1. 限制 \(a_x\) 不能找不到值:\((x,n) \to t:\infin\)
  2. 限制 \(b_i > 0\)\(a_{u_i} > a_{v_i}\),对于每个 \(1 \le i \le m,1\le j< n\)\((v_i, j) \to (u_i,j+1):\infin\)
  3. 最小割答案计入:\((x,i-1)\to (x,i):i \times c_x\)

然后就可以正确求出答案了。

posted @ 2025-02-17 17:45  goldspade  阅读(17)  评论(0)    收藏  举报