有向グラフか無向グラフかを判断するための高速アルゴリズムを知りたいのですが。
This 投稿はそれを扱っているようですが、あまり明確ではありません。このリンクによると、グラフが非巡回である場合、それはツリーです。しかし、以下の有向グラフと無向グラフを検討すると、私の意見では、グラフ1と4だけがツリーです。 3は循環的でもツリーでもないと思います。
有向グラフまたは無向グラフがツリーであるかどうかを効率的に確認するには、何をチェックする必要がありますか?そしてそれを一歩先に進めます:ツリーが存在する場合、それは二分木ですか?
有向グラフの場合:
発信エッジのみを持つ頂点を見つけます(そのような頂点が複数あるか、まったくない場合は失敗します)。
その頂点からBFSまたはDFSを実行します。すでにアクセスした頂点に遭遇した場合、それはツリーではありません。
完了し、未探索の頂点がある場合、それはツリーではありません。グラフは接続されていません。
そうでなければ、それは木です。
二分木をチェックするには、各頂点に最大2つの出力エッジがあるかどうかをさらにチェックします。
無向グラフの場合:
単純な深さ優先探索(任意の頂点から開始)でサイクルを確認します- "未探索のエッジが以前に訪問したノードにつながる場合、グラフにはサイクルが含まれます。" サイクルがある場合、それは木ではありません。
上記のプロセスでいくつかの頂点が未探索のままになっている場合、接続されていないため、ツリーではありません。
そうでなければ、それは木です。
二分木をチェックするには、さらに、すべての頂点に1〜3個のエッジがあることを確認します(1つは親に、2つは子に)。
非巡回接続された無向グラフにhas toが存在するため、ルートをチェックする必要はありません。つまり、1つの頂点に1〜2個のエッジが含まれるかどうかです。
多くの無向グラフでは、二分木にした場合、複数のノードをルートにすることができるため、ルートを特定することは一般的には不可能であることに注意してください(特別な場合に可能かもしれません)。
無向の与えられたグラフがツリーである場合: