(容斥+图)「SWTR-5」Chain

「SWTR-5」Chain

哼中欧沟

骡咕

题意

给定一个不一定连通的有向无环图,求问删去给定的若干个点后从原图所有入度为0的点到原图所有出度为0的点的方案数。

思路

其实眼瞎根本看不出来有容斥(其实也不会写)。观察数据范围,\(n\) 仅仅到 \(2e3\),且有足够多特殊性质做铺垫。

Subtask 1

显然如果删去点的个数为0则含有1条链,否则则含有0条。一个特判就能获得高达1分。

Subtask 2,3

数据范围比较小,可以暴力查找。可以获得34分,良心出题人。

Subtask 4

回归正解的思路。令原图共有 \(qsum\) 种方案,每个点到出度为0的点的方案数为 \(f\) ,从入度为0的点到该点的方案数为 \(g\)。易知删去点对答案的贡献为 \(f*g\) 。所以答案就为 \(qsum-f*g\) 。 如何求得 \(f\) ?通过深搜递归可以统计。再将所以入度为0的点的方案数加和即为 \(qsum\)\(g\)\(f\) 求法相同,只不过就是建个反图跑一遍深搜。

Subtask 5

设点a,b。参考子任务4的求法,我们不难发现 \(ans\)\(f*g\) 有关。但我们不难知道我们不能直接像上一问一样直接减去。

如果 $ dis[a][b]=dis[b][a]=0 $,说明a,b 不连通,答案互不影响,直接减去即可。
否则其中一点的某些路径必然会经过另外一点,直接减去会减多。所以就加上被多减的部分 \(dis[a][b]*g[a]*f[b]\)

Subtask 6

有了前面几个子任务的铺垫不难得出思路,而且能想到容斥。就是减减加加重复贡献。虽然还是写不出来,但是这题(的题解)还算良心,能让我看懂并理解后求出来。这题并没有用到复杂的容斥。为了防止重复计算,先将删除的点按入度为0的拓扑序排序,再进行计算。令\(kk\)为到这个点的实际方案数,初始时\(kk=g\)。由于遍历时会计算到前面已经算到的方案数,所以应分别计算减去前面已有的贡献\(dis[i][j]*kk[j]\)。最后\(qsum-kk[i]*f[i]\)则为计算结果。这里利用拓扑排序通过调整顺序保证了每个点的贡献不重复计算。

综上,不愧为大神们挑出来的好题,既符合当前知识水平,又能提升思维,锻炼代码实现和调试能力,虽然还是题解的功劳才助我A了这道题

代码实现

太丑了太长了就不粘过来了

posted @ 2025-08-09 15:42  _dlwlrma  阅读(6)  评论(0)    收藏  举报