我有一组学生(为了概括起见,在标题中称为项目)。在这些学生中,有些人以粗暴着称。我们被告知一组“我讨厌 j”形式的仇恨关系。“我讨厌 j”并不意味着“j 讨厌我”。我们应该将学生排成一排(最前面的一排编号为 1),如果“我讨厌 j”,那么我应该排在编号严格小于 j 的排中(换句话说:在j 行前面的某行),这样我就不会向 j 扔任何东西(不允许转身)。找到所需的最小行数(每行不必有相同数量的学生)的有效算法是什么?
我们将做出以下假设:
1)如果我们将其建模为有向图,则图中没有环。最基本的循环是:如果“我讨厌 j”为真,“j 讨厌我”为假。因为否则,我认为订购将变得不可能。
2)小组中的每个学生至少被另一个学生讨厌或至少讨厌另一个学生。当然,也会有学生既被一些学生讨厌,又反过来讨厌其他学生。这意味着没有不属于图表一部分的流浪学生。
更新:我已经考虑过用 i --> j if 'i hats j 构建有向图并进行拓扑排序。但是,如果我必须将所有学生排成一行,则一般拓扑排序会更适合。由于这里的行有所不同,我试图弄清楚如何将变化因素考虑到拓扑排序中,这样它就给了我想要的东西。
当您回答时,请说明您的解决方案的复杂性。如果有人提供代码并且您不介意该语言,那么我更喜欢 Java,但当然任何其他语言都一样好。
JFYI 这不适用于任何类型的作业(顺便说一句,我不是学生:))。