【问题标题】:Graph algorithm for dividing students into two groups将学生分成两组的图算法
【发布时间】:2014-11-20 07:06:54
【问题描述】:

我正在努力创建一种有效的算法,该算法可以确定一组学生是否可以分为两组。

请注意,有一些提供的约束类型为(X,Y) 学生X 必须与学生Y 一起使用,而某些类型的约束为(A,B) 学生A 不能与学生@987654326 一起使用@。不是每个学生都对他有约束,有些学生有多重约束。

我考虑了一个图,其中每个学生都是一个节点,然后如果学生可以在同一组中,则两个节点通过一条边连接(例如,他们要么具有必须在一起和/或不在一起的约束'没有他们不能在一起的限制)。但是,一旦我构建了这个图形表示,我不确定我可以应用什么算法来解决(或证明,鉴于一组约束这是不可能的)。

有什么建议吗?谢谢!

【问题讨论】:

  • 我认为你的计划是好的第一步。您可能有几个集群,通过“同组”约束边连接的学生。之后,“不在同一组”约束可用于将集群分成两组。我不知道如何对待没有任何约束的学生。
  • 您希望仅使用 2 种颜色为您的图表着色,这是使用 Ali 建议的二分图完成的。

标签: algorithm graph breadth-first-search depth


【解决方案1】:

您可以使用以下步骤,然后使用Bipartite Graph 算法。

  1. 考虑一个图,其中每个学生都是一个节点,如果学生在同一组中,则两个节点通过一条边连接。

  2. 如果学生 A 和 B 必须在同一组中,则将 B 连接到 A 连接的每个节点,并将 A 连接到 B 连接的每个节点。

现在你有一个图,你想检查顶点是否可以分成两个不相交的集合,并且同一集合中的两个节点之间没有边。这是二分图,你可以找到解决这个问题的算法。

使用 PeterdeRivaz 评论编辑

这个答案更好,因为彼得说你可以改变我的步骤:

  1. 考虑一个图,其中每个学生都是一个节点,如果学生在同一组中,则两个节点通过一条边连接。

  2. 如果学生 A 和 B 必须在同一组中,则将 A 和 B 连接到一个虚构的学生。

【讨论】:

  • @Sayakiss,谢谢 Sayakiss :) 如果你觉得这很好,请不要忘记投票 :)
  • 如果 A 和 B 必须在同一个组但没有连接怎么办?通过一个新的假想学生加入他们可能更容易?
  • @PeterdeRivaz 谢谢伙计,太棒了。 :) 我会编辑我的答案和那个。
  • @mtk99 您在错误的地方发表评论:P 您必须对问题发表评论,以便 OP 可以看到。
  • 我不确定我是否正确地关注您:假设边缘集 (a,b)(b,c)(b,d)(d,e) 表示不在同一组中约束和 (a,e) 表示相同的组约束。您的方法会将 (b,e) 和 (a,d) 添加到图中,这使得它不是二分的,而实际上它们可以分为两组。
【解决方案2】:

图 A 是应该在一起的学生的图,图 B 是不能在一起的学生的图。

对于A中的每两个节点X,Y都有一条从X到Y的路径,如果B中的X和Y之间存在边,那么这个问题就无法解决。否则可以解决。

解决这个问题需要对 A 中的每组连接节点进行迭代,在每次迭代中,您随机选择一组并尝试将其移动到两个组之一,检查该组中每个节点的约束确保您满足组中其他节点的约束。如果集合中的一个节点不能满足约束,则将该集合添加到另一组。

当每组都在没有冲突的两组中时,您应该停止。

【讨论】:

    猜你喜欢
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多