我正在努力创建一种有效的算法,可以确定一组学生是否可以分为两组。
请注意,(X,Y)
学生X
必须与学生Y
有一些类型的约束,以及(A,B)
学生{的类型约束{1}}不能与学生A
合作。不是每个学生都对他有约束,有些学生有多种限制。
我已经考虑了一个图表,其中每个学生都是一个节点,然后如果学生可能在同一组中,则两个节点通过边缘连接(例如,他们要么必须在一起和/或不在一起?有他们不能在一起的约束)。但是,一旦我构造了这个图形表示,我不确定我可以应用什么算法来解决(或证明,给定一组约束这是不可能的)。
对任何建议表示赞赏?谢谢!
答案 0 :(得分:5)
您可以使用以下步骤,然后使用Bipartite Graph算法。
考虑一个图表,其中每个学生都是一个节点,如果学生不属于同一组,则两个节点通过边连接。
如果学生A和B必须在同一组中,则将B连接到A所连接的每个节点,并将A连接到B所连接的每个节点。
现在你有一个图表要检查顶点是否可以分成两个不相交的集合,并且同一个集合中的两个节点之间没有边缘。这是Bipartite Graph,您可以找到有关如何解决此问题的算法。
使用PeterdeRivaz评论
进行编辑这个答案更好,因为彼得说你可以改变我的步骤:
考虑一个图表,其中每个学生都是一个节点,如果学生不属于同一组,则两个节点通过边连接。
如果学生A和B必须在同一组,则将A和B连接到想象中的学生。
答案 1 :(得分:2)
图表A是应该在一起的学生的图表,图表B是不能在一起的学生的图表。
对于A中每两个节点X,Y,其中存在从X到Y的路径,如果存在B中的X和Y之间的边缘,则此问题无法解决。否则,它可以解决。
对于A中的每组连接节点,解决此问题将是迭代的,其中在每次迭代中您随机选择一个集合并尝试将其移动到两个组中的一个,检查集合中每个节点的约束确保您满足组中其他节点的约束。如果集合中的一个节点无法满足约束,则将该集合添加到另一个组。
当每个集合都在两个组中的一个组中且没有冲突时,您应该停止。