topcoder 15279 SpanningSubgraphs
题意
有一个 \(n\) 个顶点,\(m\) 条边的有向图,可能有子换以及重边. 定义 \(f(k)\) 为从选出 \(k\) 条边所有点都联通的方案数. \(g(k)\) 则为 \(f(k)\ mod\ 10^9+7\). 要求求出所有 \(n-1\leq k\leq m,g(k)\).
\(1\leq n\leq 15,1\leq m\leq 200\)
题解
正向求很困难,所以考虑容斥.
设 \(dp(s,i)\) 为当前强制联通的点集为 \(s\) ,连了 \(i\) 条边时的方案数,\(g(s)\) 为两个端点都在 \(s\) 中的端点集合个数.
\(dp(s,i)=C_{g(s)}^{\ i}-\sum\limits_{lowbit(s)\in t,t\subseteq s}\sum dp(t,j)\ C_{g(s-t)}^{\ i-j}\).
相当于减去不联通的方案,可是不连通的方案要不重复地减去. 所以固定最小的节点,用最小节点所在的联通块乘上剩下边随便选的方案数.
但是此时的时间复杂度是 \(O(3^n m^2)\) 的. 过不了.
hb说因为 \(C\) 的部分之和边数有关,所以可以分类然后做一次卷积,把时间复杂度优化到 \(O(3^nm+2^n m^2)\) 来通过此题. 但是我还没有想好如何优化.
我的错误想法:
做法1
我以为不合法的方案就是一些节点没有边与之相连,可以用容斥解决,但是显然是错误的.
做法2
可以考虑用bfs的层数加边,这显然是可以保证不重复的. 但是需要的时间复杂度非常大,而且难以优化.
小结
hb说这是省队入门的题目,我谔谔
在思考问题的时候,不仅要坚持地钻研一个问题,也要适可而止地放弃错误的想法. 就像做法2中完全没有办法优化的做法我还舍不得放弃……

浙公网安备 33010602011771号