この課題の目的は、有限有向非巡回グラフ(DAG)を与えられ、グラフが推移的縮小であるかどうかを判断することです。
DAGと推移的削減の概要:
DAGは有向エッジを持つグラフです(つまり、そのエッジ上を一方向にのみ移動できます)。そのため、グラフ上の開始ノードがある場合、開始ノードに戻ることはできません(つまり、サイクルはありません)。
開始ノードがある場合、任意の正の数のエッジを介してグラフ内の別の終了ノードに移動できる場合、その終了ノードは開始ノードから到達可能として定義されます。一般的なDAGには、開始ノードからターゲット終了ノードまでの複数のパスが存在する場合があります。たとえば、次のひし形グラフをご覧ください。
ノードに到達するためにD
からA
、あなたはパスを取ることができますA->B->D
かA->C->D
。したがって、D
から到達可能ですA
。ただし、node B
から開始するノードに到達するために使用できるパスはありませんC
。したがって、node B
はnode から到達できませんC
。
グラフのすべての開始ノードの到達可能ノードのリストとして、グラフの到達可能性を定義します。したがって、同じダイアモンドグラフの例では、到達可能性は次のとおりです。
A: [B, C, D]
B: [D]
C: [D]
D: []
上記のグラフと同じ到達可能性を持つ別のグラフを以下に示します。
ただし、この2番目のグラフには、元のグラフよりも多くのエッジがあります。グラフの推移的削減は、エッジの数が最も少なく、元のグラフと同じ到達可能性を持つグラフです。したがって、最初のグラフは2番目のグラフの推移的な減少です。
有限DAGの場合、推移的縮約が存在することが保証されており、一意です。
入力
入力は「リストのリスト」であり、外部リストは頂点の数の長さを持ち、各内部リストは関連するノードを離れるエッジの数の長さであり、宛先ノードのインデックスを含みます。たとえば、上記の最初のグラフを説明する1つの方法は次のとおりです(ゼロベースのインデックス付けを想定)。
[[1, 2], [3], [3], []]
任意の整数値で最初のノードのインデックス作成を開始できます(0または1ベースのインデックス作成など)。
入力は、必要な入力ソース(stdio、関数パラメーターなど)から取得できます。追加情報が提供されない限り、正確な入力形式を自由に選択できます。たとえば、stdioから入力を取得する場合、各行を関連ノードのエッジのリストにすることができます。例:
1 2
3
3
'' (blank line)
各隣接リストのインデックスは必ずしもソートされているわけではなく、2つのノードを接続する複数のエッジが存在する可能性があります(例:)[[1,1],[]]
。入力グラフが弱く接続されており、サイクルが含まれていない(つまり、DAGである)と仮定できます。
出力
与えられた入力DAGが推移的還元である場合、出力は真実であり、そうでない場合は偽の値です。これは、任意のシンク(stdio、戻り値、出力パラメーターなど)に対して行うことができます
例
すべての例では、0ベースのインデックス付けを使用しています。
[[1,2],[3],[3],[]]
true
[[1,2,3],[3],[3],[]]
false
[[1,1],[]]
false
[[1,2,3,4],[5,6,7],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
true
[[5,6,7],[2,3,0,4],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
true
[[5,6,7],[2,3,0,4,14,5,7],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
false
[[5,6,7],[2,3,0,4],[5,8,9],[6,8,10],[7,9,10,14],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
false
[[1,3],[2],[3],[]]
false
得点
これはコードゴルフです。バイト単位の最小コードが優先されます。コードは妥当な時間内に完了する必要があります(使用しているハードウェアで最大10分)。標準の抜け穴が適用されます。必要なビルトインを使用できます。