H Permutation Counting
https://ac.nowcoder.com/acm/contest/34866/H
题意
给定n以及m对限制条件 x y代表Px 要比 Py小
求符合限制条件的1-n的全排列有多少
思路
用并查集 维护相互制约的几个数 不同集合之间就是独立的
那么就可以根据每个集合的大小 用组合数 计算出n个数分成那几个集合的方案数 \(C_{sum}^size\)
每次确定一个集合剩余数的总数(sum)就要减去这个集合大小
然后根据集合中的制约关系在增加方案数
对于一个集合可以看成一颗单独的树 根节点是最先的祖先
每次对于一个节点我们都能确定最大的那个是那个数 然后它的延伸的子树可以随机分配
要实现这个我们必须知道以每个节点为根节的子树的大小 (用深搜递归从深往浅传递树的大小)
这样才能用$C_{单独儿子子树的大小}^{根节点未被安排的的所有后辈的数量} 然后递归每一棵更小的树
除此之外这道题还可能有环 那么我们只要开一个数组标记该位置是否被访问过 然后从祖先节点遍历 若有一个位置被遍历了两遍那就说明存在环 直接输出0即可
#include
#include
#include
#include