遍历所有大小为n的独特循环赛
有一个循环赛,参与者有 n 个人。也就是说,每一对不同的参与者 i 和 j 都会互相比赛,比赛结果可以用一个有向图来表示,图中要么有一条从 i 指向 j 的边,要么有一条从 j 指向 i 的边。
假设 n 是 3,那么参与者就是 i、j 和 k。可能的情况是有一条边从 i 指向 j,从 j 指向 k,从 k 指向 i。还有一种可能是从 i 指向 k,从 k 指向 j,从 j 指向 i。但是如果我进行的操作不关心“参与者”的身份,那么这些比赛实际上是相同的。还有一种可能是从 i 指向 j,从 i 指向 k,从 j 指向 k,这属于另一种“类型”的三人比赛。
所以,我想写一个程序,最好是用 Python,能够遍历所有 n 个参与者的独特比赛。
我现在的解决方案是生成一个长度为 n * (n-1) / 2
的位字段,然后用它来填充邻接矩阵的上三角部分。然后,对于上三角中的每个 0,下面对应的地方就是 1。显然,这样可以找到所有 n 个人的循环赛,但实际上有很多比赛是相同的,这让程序运行得很慢。我并不指望 n 会大于 15,但现在的情况并不理想。
如果有人知道或者能推导出有多少个独特的 n 人循环赛的公式,那肯定会有帮助。