トピック:
分析:
これは典型的なトポロジカルソートの問題です。だから、トポロジカルソートは何ですか?
トポロジカルソート:
完了するまでにA、B、Cは、任意の時間A、BおよびCで完了することができますが、唯一のAの完了後に完了すること、その後、トポロジカルソートがA> B> CまたはA> C> Bのことができることを三つがあります。
全体として、トポロジカルソートは有効なシーケンスが与えられると、依存性イベントを有するお互いのためにそこにあります。
図の説明:
図面を反応は、有向非循環グラフのトポロジーは、図リングトポロジー的A三の形リングに依存し(例えば、A-依存B、B-依存C、Cをソートすることができないが、何も存在し、ソートすることができないれます完成措置)
明らかに「カリキュラム」このトピックでは、依存関係与えられた判断の対象である、ことができトポロジカル整列、またはそれがあるかどうかを非循環有向グラフ
アイデア:
トポロジカル・ソートのために、決定するための2つの方法があります。
1、深さ優先探索(DFS)、リングがあるか否かを判定する
図2に示すように、ノードの次数は、ノードは、トポロジカルソートの例は引用したように、ノードのノード番号をポイントの点で、角度Aが0である、侵入のBC 1れます
ここでの使用ノードの次数かトポロジカルソートを決定するために、または非循環有向グラフであります
ノードの次数が0である限り、それは条件に依存しない手段としてのノードの開始ノードを低減しつつ、それは、直接出力することができます
トピックに戻ります
タイトル知られ、Nコースは0からn-1のIDにあります
私たちは、[i]はpreNum、あなたはpreNum配列を定義することができ、各コースの程度を知る必要があります:私はコースの数が異なり表しレッスン
学位コース0に探して、我々はプログラムを完了することがあるかどうかを知る必要があり、同時に、あなたが訪問した訪問した配列を、定義することができます[I]:私は、コースの数は上完了している表し
getNextを()関数を構築するもちろん便利0度を見つけるために、もちろん0度を見つけるために使用
コード:
クラスのソリューション{ パブリック: int型 getNextを(ベクトル< 整数 > preNum、ベクトル< 整数 > 訪問){ のためには、(int型は、私は= 0 ; I <preNum.size(); I ++) 場合(訪問[I] && preNum [I! ]) を返す私は、 リターン - 1 。 } BOOL canFinish(INT numCourses、ベクトル<ベクトル< INT >>&前提条件){ int型 N = prerequisites.size()。 ベクトル < int型 > <(numCourses)訪問しました。 ベクトルのint > preNum(numCourses)。 以下のために(INT iが= 0、I <N; I ++)preNum [前提条件[I] [ 0 ] ++ ; 用(INT訪問I = getNextを(preNum); I =! - 1 ; iは= getNextを訪問(preNumを)){ [i]を訪問 = 1 。 numCourses - ; 用(INT J = 0 ; J <nであり、j ++ ){ 場合(前提条件[J] [ 1 ] == I)preNum [前提条件[j] [ 0 ]] - 。 } 場合(!numCourses)が返す場合はtrue。 } を返す場合はfalse } }。
もちろん、このプログラムに改善の余地がある、例えば、道の下で0度のコースを取得し、サイクルのすべての使用を
動的にコースがスタックにプッシュされ、ゼロの浸透であるときはいつでも、時間を節約するために、興味のある学生は、自分の外観を書くことができ、スタックを維持
私は少しテスト実行時間が大幅に短縮されていませんでしたが、メモリの消費量が低減され、それはメモリの使用量を減らし、関数呼び出しの数を減らすためにする必要があります