私は学生のセットを持っています (一般性のためにタイトルでアイテムと呼ばれます)。これらの学生の中には、やんちゃであるという評判がある学生もいます。「私はjが嫌い」という形の一連の憎悪関係について話されます。「私は j が嫌い」は、 「j は私が嫌い」という意味ではありません。「iがjを嫌う」場合、iがjの番号よりも厳密に小さい番号の列に配置されるように、生徒を列に並べます(最前列の番号は1) 。 j の行の前にある行) を使用して、j に何もスローしないようにします (後戻りは許可されません)。必要な行の最小数を見つけるための効率的なアルゴリズムは何でしょうか (各行の生徒数が同じである必要はありません)。
次の仮定を行います。
1) これを有向グラフとしてモデル化すると、グラフにサイクルはありません。最も基本的なサイクルは次のようになります。「i は j が嫌い」が true の場合、「j は i が嫌い」は false です。そうしないと発注できなくなると思うからです。
2) グループ内のすべての生徒が、少なくとも 1 人の他の生徒に嫌われている、または少なくとも 1 人の他の生徒を嫌っている。もちろん、一部の人に嫌われている生徒と、他の生徒を嫌っている生徒がいるでしょう。これは、グラフの一部を形成しない迷子の生徒がいないことを意味します。
更新: 'i が j を嫌う場合、i --> j を使用して有向グラフを作成し、トポロジカル ソートを行うことを既に考えています。ただし、すべての生徒を一列に並べる必要がある場合は、一般的なトポロジカルソートの方が適しているためです。ここには行のバリエーションがあるため、トポロジーソートへの変更を考慮して、必要なものを得る方法を見つけようとしています。
回答するときは、ソリューションの複雑さを述べてください。誰かがコードを提供していて、言語を気にしないのであれば、私は Java を好みますが、もちろん他の言語でも問題ありません。
JFYI これは宿題用ではありません (私は学生ではありません :))。