「USACO 2021 US Open Platinum」Routing Schemes
「USACO 2021 US Open Platinum」Routing Schemes
\(K=0\)
此时,我们只需要求合法的匹配路径数量,并且一个路径是从小到大的
由于题目保证一定存在合法路径,从 \(1\) 到 \(n\) 考虑每一条 \((u,v),(v>u)\)
我们可以看成是很多个 \(S\) 在路径上被从 \(1-n\) 不断地推过去
设一个点的入度为
\(ind_v=\sum_{(u,v)} 1+[v为S]\)
\(outd_u=\sum_{(u,v)} 1+[u为R]\)
每次到达一个点,必然有其 \(ind_u=outd_u\) ,即推进来的 \(S\) 个数恰好等于出边个数
此时合法的分配这 \(outd_u\) 个 \(S\) 的方案数就是 \(outd_u!\)
直接求 \(\prod outd_i!\) 即可
\(K=1\)
存在反边的图看起来十分难处理,不妨直接把反边断掉
假设断掉前包含环的路径为 \(S_1\rightarrow a\rightarrow b\rightarrow R_1 (a>b)\)
则断掉后的路径变成 \(S_1\rightarrow a\) , \(b\rightarrow R\)
不妨将在 \(a\) 上额外添加一个 \(R\) ,在 \(b\) 上额外添加一个 \(S\)
此时,新的问题又只包含 \((u,v)(u<v)\) ,同 \(K=0\) 求解
理想情况下,新问题中的所有方案均可以通过将 \(a,b\) 相接还原
但是显然如果最终方案上 \(b\rightarrow a\) 相接就会成环
所以需要额外 \(dp\) 出包含 \(b\rightarrow a\) 的非法方案
考虑用类似 \(K=0\) 的办法,我们扫描每个 \(i\) 将 \(S\) 向后推
令 \(dp_i\) 表示当前 \(dp\) 的路径最后一个点是 \(i\) 的方案数
我们希望结束点是 \(a\) ,开始点是 \(b\)
此时依次推过去 \(i\) ,此时只有 \(dp_{j},j\ge i\) 的情况是合法的
考虑 \(j=i\) 时,需要为 \(j\) 找一个归宿 \(k\) ,或者判定 \(j=a\) 时结束路径
此时,相当于在原图上使 \(outd_i\) 减少了 \(1\)
得到转移 \(dp_k\leftarrow dp_j\cdot (outd_i-1)!\)
当 \(j>i\) 时,不需要考虑 \(j\) 的变化
得到转移 \(dp_j\leftarrow dp_j\cdot outd_i!\)
\(K=2\)
有了 \(K=1\) 的铺垫,想必这里十分简单
设反边为 \((a,b),(c,d)\) ,显然加入两组 \(S,R\)
考虑新图上什么样的情况是不合法的
\(b\rightarrow a\)
\(d\rightarrow c\)
注意1,2是有交的
- \(b\rightarrow c\rightarrow d\rightarrow a\)
环交错扭在一起,这种情况比较容易漏掉
稍微容斥一下即可
复杂度分析:
扫描每个 \(i\) 时, \(dp_{x,y}\) 中满足 \(x=i\) 或 \(y=i\) 的有 \(O(n)\) 个,转移每个需要 \(O(n)\) 时间
扫描每个 \(i\) 时, \(dp_{x,y}\) 中满足 \(x=i\) 且 \(y=i\) 的有 \(O(1)\) 个,转移每个需要 \(O(n^2)\) 时间
因此复杂度为 \(O(n^3)\) ,常数不算太大
1 | const int N=110,P=1e9+7; |