有向非巡回グラフ与えられた場合、頂点のは、その次数がゼロの場合のソースであり、出力アークのみを持つことを意味します。
与えられた有向非巡回グラフでソースを見つけるための線形時間アルゴリズムはありますか?
追加質問:線形時間ですべてのソースを見つけることができますか?
有向非巡回グラフ与えられた場合、頂点のは、その次数がゼロの場合のソースであり、出力アークのみを持つことを意味します。
与えられた有向非巡回グラフでソースを見つけるための線形時間アルゴリズムはありますか?
追加質問:線形時間ですべてのソースを見つけることができますか?
回答:
Yuvalが述べているように、データ構造はここで重要です。いくつかの種類の隣接リストの解決策を提供しようと思います。
補足として、データ構造を選択する場合は、実行するすべての操作と頻度を分析し、適切なデータ構造を選択する必要があります。
編集:ケース1の場合、ソースの数が|に比べて非常に少ないDAGがある場合 V | (たとえば、1つのソースを持つツリー内)、および任意の頂点からソースまでの平均距離が|に比べて小さい場合 V | そしてあなたが唯一のいずれかのソースをしたい、あなたは(最悪の場合漸近複雑さが同じになりますが)平均アルゴリズムに速く使用することができます。任意の頂点をランダムに選択し、その親のいずれかに(入力エッジリストから)移動し、さらにその親に移動して、親のないノード(ソース)に到達するまで続けます。このわずかな効率向上は、アルゴリズムが少し複雑な非常に限られたタイプのグラフ用です。
隣接リスト形式で与えられたグラフG =(V、E)があると仮定します。(ここで明確にするために、リストにはソースからのすべての発信エッジが含まれています)。線形時間でグラフGの逆を作成できます。次に、逆グラフを反復処理して、空の隣接リストを持つすべての頂点を収集できます。これらの頂点には、逆グラフに出力エッジがありません。つまり、元のグラフに入力エッジがないため、これらはソース頂点です。
実行時間は線形です。グラフの逆を作成するには、最大でO(| V | + | E |)時間かかります。グラフの逆を繰り返すには、O(| V |)時間かかります。