ARC163D

发布时间 2023-12-14 23:27:42作者: qwq_123

题面

考虑一张竞赛图 \(G\),其中有 \(N\) 个节点,节点编号为 \(1,2,\dots,N\),且 \(G\) 满足:

  • 对于 \(G\) 中的所有边 \(u\to v\),恰好有 \(M\) 条边满足 \(u<v\)

\(f(G)\) 表示图 \(G\) 中的强连通分量数量。请你求出所有满足条件的 \(G\)\(f(G)\) 之和。

\(1\le N\le30\)\(0\le M\le\frac{N(N-1)}2\)

题解

  • 常规做法

\(f_{i,j}\) 表示有 \(i\) 个点,\(j\) 条满足条件的边的SCC的数量,\(g_{i,j}\) 表示有 \(i\) 个点,\(j\) 条满足条件的边的任意图数量,一般的求法就是 \(f_{i,j}=g_{i,j}-\sum_{p}\sum_{q}f_{p,q}\cdot g_{i-p,j-q}\)

但是这里我们需要保证 SCC 和一般图中的点不会形成一个新的SCC,并且还要考虑 SCC 和一般图直接连边的贡献。

看似不可做了,但是要注意竞赛图的性质,就是你把竞赛图缩点会得到一条链,链上前面的点到后面的每个点都有边。

那么我们可以默认隔开的SCC就是链最左边的那一个,这样这个SCC连出来的边就都是向外的,这样不仅解决了分隔的问题,两个图连接的贡献也好统计了。

\(h_{i,j,k}\) 表示有 \(i\) 个点,SCC有 \(j\) 个点,两个图连接处有 \(k\) 条从小到大的边 的方案数,那么有:

\[f_{i,j}=g_{i,j}-\sum_{k=1}^{i-1}\sum_{p=0}^jf_{k,p}\sum_{q=0}^{j-p}h_{i,k,q}\cdot g_{i-k,j-p-q} \]

其中可以预先处理后面的一坨,就可以做到 \(O(n^6)\)

统计答案也是类似的,而且要记录 SCC 的和 和 图的方案数来统计答案。

  • 高端做法

上面的做法固然可以,但是没有进一步利用竞赛图的性质,有结论:

一个竞赛图的 SCC 个数等于将其点集划分为两个集合 \(A,B\)(可为空集)并满足以下限制的方案数 \(−1\)

  • 对于每条满足 \(u\in A,v\in B.\) 的边 \((u,v)\),都满足其方向为 \(u\to v\)

证明考虑将这个图缩点,变成了一条链,链上前面的点到后面的每个点都有边。这样我们找到一个分界点 \(i(0\le i\le k)\),将 \(p_1,p_2,…,p_i\) 所对应的 SCC 划入 \(A\),将\(p_{i+1},…,p_k\) 所对应的 SCC 划入 B。这样一个图就会贡献 SCC 个数 \(+1\) 次。

这样DP就变得简单了,设 \(f_{i,j,k}\) 表示满足 \(|A|=i,|B|=j\) ,有 \(k\) 条满足要求的边的方案数,转移是比较简单的。

  • 更高端的做法

如果没有把这个结论这么具象的表示出来,也是可以做出来的。

我们还是在缩点后的链上去考虑,对于链上的一个分界点 \(p_x\),我们不关心 \(p_1\sim p_x\) 到底分别是什么,\(p_{x+1}\sim p_k\) 是什么,只需要关系如果 \(p_1\sim p_x\)\(p_{x+1}\sim p_{k}\) 都连了过去的边,那么就会对答案产生一次贡献。

你会发现这是我们就只关心 \(p_1\sim p_x\) 节点的数量和满足了多少边的条件,而且方案数就是做法一的 \(h\) 。所以答案就是:

\[ans=\sum_{i=1}^n\sum_{j=0}^mg_{ij}\sum_{k=0}^{m-j}h_{n,i,k}\cdot g_{n-i,m-j-k} \]

启发

  • 竞赛图的一些性质。
  • 半在线卷积式的转移被固定的一方可以灵活选取。
  • 高妙的统计答案的方法。