ARC163D
题面
考虑一张竞赛图 \(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\) 条从小到大的边 的方案数,那么有:
其中可以预先处理后面的一坨,就可以做到 \(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\) 。所以答案就是:
启发
- 竞赛图的一些性质。
- 半在线卷积式的转移被固定的一方可以灵活选取。
- 高妙的统计答案的方法。