已知n个人,若任意两人既可以是朋友,也可以不是朋友,怎么求所有可能的朋友圈。
怎么用代码枚举 n!
已知n个人,若任意两人既可以是朋友,也可以不是朋友,怎么求所有可能的朋友圈。
怎么用代码枚举 n!
可以这样:
我们考虑把最终的朋友圈的每一个集合内选一个编号最小的为根,其它所有同集合的点都连向它,那么最终就会形成一个菊花图组成的森林,
那么由上面所说的规则来看,一种朋友圈所对应的森林是唯一的,可以通过枚举这样的森林来枚举朋友圈。
那么我们就可以按编号从小到大枚举每个点连向的那个点(父亲),如果自己是根就连向他自己(类似并查集),
由于每个点连向的点编号肯定不会大于它自己,因此对于一个点 i 只需要枚举 1~i 中的根节点为它的父亲,而复杂度也就是最多 1*2*3*...*n = n!
对于得到的森林,从每个根节点开始遍历每棵树,所得的就是每个朋友圈中的点