一行中有N名学生。我们想拍出最好的照片。当满足最大学生人数时,照片被认为是最好的。如果他是他最好的朋友的正确邻居,学生会感到满意。每个学生只有一个最好的朋友。您必须在最佳照片中找到满意学生的数量以及不同的最佳照片数量。
方法:
至少有一个传入边可以满足一个节点。因此,计算满意节点的数量很容易。让我们做出数组B,其中B [i]是i的入边数。然后,满足最大节点数的不同方式是B_s的乘积。但是有一些“BAD”变体,其中所有循环节点都满足。但我们可以轻松地减去“BAD”变体。在循环节点的“BAD”变体中,我们确切地知道他们满意的是谁。所以不同的变体将是:
B [K1] * B [K2] .... B [Kn] - B [P1] * B [P2] .... B [Pm]
其中K是组件中的节点数组(至少有1个传入边),P是在该组件的循环中没有的节点数组(至少有1个传入边)。
我无法理解Bad变种的概念,为什么我们要减去它们。
请解释并为我提供一些有用的链接来解决这类问题
答案 0 :(得分:0)
我宁愿写另一篇社论而不是试图找出那个正在发生的事情。
准备一个"最好的朋友"有向图,每个顶点都是学生,每个学生都有一个弧形给他最好的朋友。提取此图的弱连接组件。在每个组件中,我们可以满足除一个学生之外的所有学生,但前提是该组件中的学生是连续的。因此,我们可以计算出每个组件的可能性数量,将它们相乘,然后乘以组件数量的排列数(即组件因子数)。
对于给定的组件,有两种可能性。第一种可能性是一个顶点完全没有传入弧,一个顶点恰好有两个,其余顶点有一个。前学生必须是最右边的,所以有一个有效的安排。第二种可能性是所有顶点都只有一个入射弧。在这种情况下,有效排列的数量等于组件中的顶点数量(任意选择最右边的学生然后绕过循环)。