图中的排列

时间:2015-08-24 16:38:27

标签: algorithm data-structures graph

一行中有N名学生。我们想拍出最好的照片。当满足最大学生人数时,照片被认为是最好的。如果他是他最好的朋友的正确邻居,学生会感到满意。每个学生只有一个最好的朋友。您必须在最佳照片中找到满意学生的数量以及不同的最佳照片数量。

方法:

  • 每个节点都处于循环中。 (每个节点只有一个传入边和一个传出边)。这里我们可以满足除一个(最左边的节点)之外的所有节点。因此,满意的节点是N-1,并且不同的变体是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变种的概念,为什么我们要减去它们。

请解释并为我提供一些有用的链接来解决这类问题

1 个答案:

答案 0 :(得分:0)

我宁愿写另一篇社论而不是试图找出那个正在发生的事情。

准备一个"最好的朋友"有向图,每个顶点都是学生,每个学生都有一个弧形给他最好的朋友。提取此图的弱连接组件。在每个组件中,我们可以满足除一个学生之外的所有学生,但前提是该组件中的学生是连续的。因此,我们可以计算出每个组件的可能性数量,将它们相乘,然后乘以组件数量的排列数(即组件因子数)。

对于给定的组件,有两种可能性。第一种可能性是一个顶点完全没有传入弧,一个顶点恰好有两个,其余顶点有一个。前学生必须是最右边的,所以有一个有效的安排。第二种可能性是所有顶点都只有一个入射弧。在这种情况下,有效排列的数量等于组件中的顶点数量(任意选择最右边的学生然后绕过循环)。