完全に接続された有向グラフG
があるとします。頂点は[a,b,c]
です。各頂点の間には両方向にエッジがあります。グラフ内のすべての「長い」単純な非循環パスを見つけるにはどうすればよいですか?
出発点がa
の場合、私はすべての方向でグラフをたどり、既にパスにある頂点に当たったときにのみそのパスを保存したいと思います。
ので、機能full_paths(a,G)
は返す必要があります:
- [{a,b}, {b,c}, {c,d}]
- [{a,b}, {b,d}, {d,c}]
- [{a,c}, {c,b}, {b,d}]
- [{a,c}, {c,d}, {d,b}]
- [{a,d}, {d,c}, {c,b}]
- [{a,d}, {d,b}, {b,c}]
をそれはすでに最初の結果に含まれているので、私は、[{a,b}]
または[{a,b}, {b,c}]
のような「不完全」な結果を必要としません。
Gのパワーセットを生成し、特定のサイズの結果を除外する方法はありますか?
どうすれば計算できますか?
編集は:イーサンが指摘したように、これは深さ優先探索の方法で解決できるが、残念ながら、私はそれを変更する方法を理解していない、それは(私が実装するためのRuby Gratr使用後戻りする前に、それはパスを保存すること私のアルゴリズム)
Ethan、私はdfsについて考えましたが、どのように各パスを正確に記録できるかはわかりません。 – skanatek
コールバックのオプションと[documentation for bfs](http://rubydoc.info/gems/gratr/0.4.3/GRATR/Graph/Search:bfs)の例を見てください。コールバックを使用して、通過したエッジと各パスを追跡するために訪れた頂点を追跡することができます。 – ethan