10秒目をつむったら…

グラフの最長パスを求めるアルゴリズムにはどのようなものがあるのでしょうか。

例えば、以下のようなグラフであれば、最長パスは6になります。

・-・-・-・-・
  |  |
  ・-・

また、以下のようなグラフの場合、
最長パスは7として計算したいです。

・-・-・-・
 / \
・-・-・
※ 下の三角形は、上の左から2番目のノードにくっついています。


最短パスを求めるアルゴリズムはいくつかありましたが、
最長パスを求めるアルゴリズムは見つけられませんでした。
何かアルゴリズム名などのキーワードはありますか。

A 回答 (4件)

グラフ理論ではいろんな言葉がごちゃごちゃに使われている傾向があるので「一般的」という言葉をむやみに使わない方がいいと思います>#3. 同じ概念を異なる言葉で表現していたり, 逆に同じ言葉で異なるものを意味していたりすることはよくあるので....



「ひたすらパスを作って最長のものをおぼえる」だけでアルゴリズムにはなるんだけど.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

> 「ひたすらパスを作って最長のものをおぼえる」だけでアルゴリズムにはなるんだけど.

確かにそうですね。
最初のアルゴリズムとしてはこれを使ってみようと思います。
処理時間を実測してみて、ちょっと実用に耐えられないようなら他のアルゴリズムを検討してみます。


それから、コメントありがとうございます。

お礼日時:2014/07/26 12:08

#2の補足は一般的に言うパスには成っていません。

あなたのパスの定義は何でしょう。

>パスの意味が分かってるのかな。
これは無視ですか。

この回答への補足

元々の質問を整理しますが、

・-・-・-・
 / \
・-・-・

上記のようなグラフの場合、

  1 6 7
 ・-・-・-・
 2/ \5
 ・-・-・
  3 4

このようにカウントして最大パス長は7として計算したいということです。

==========

普段はわざわざこのようなことは書かないのですが、
回答いただけたのも何かの縁ですので。。。


質問を読んでいただいて理解されているとは思いますが、
この質問は最大パス長の定義を問うものではありません。
前述したとおりの方法で最大パス長を求める方法に関する質問です。
それは質問自体と、No.2の補足で説明した通りです。

ですので、

> > パスの意味が分かってるのかな。
> これは無視ですか。

お礼のコメントを無視したわけではなく、どのように計算するのか具体例を示すことで、
最大パス長(この例では7)の求め方を示したつもりです。


グラフ理論における典型的な最大パス長が、例えばループがないものとかその他のどのようなものであれ、
今回の質問に関してはまったく興味がありません。
質問や補足に記載の方法で最大パス長を求めるためにはどうしたらいいか知りたいのです。


どのように最大パス長を計算すればよいか、アルゴリズムやあるいは検索キーワードを教えていただけませんか。



それでもなお、質問自体に回答せず、
「その定義は一般的な最大パス長ではない」とか「正しい最大パス長の定義を理解していますか?」とか、
「質問文に『最大パス長』という文言が含まれているのに勝手な定義をしないでください」とおっしゃるのであれば、
それはお互い工数の無駄になるだけですので、私の質問に回答していただかなくてかまいません。

補足日時:2014/07/26 12:05
    • good
    • 0
この回答へのお礼

補足の通りです。

お礼日時:2014/08/23 13:22

効率はともかく、アルゴリズムを知りたいんだろうけど。


パスの意味が分かってるのかな。
2つ目の例は何故7なんだろう。

この回答への補足

分かりにくくてすいません。

2つ目のグラフについて、次のようにカウントします。

  1 6 7
 ・-・-・-・
 2/ \5
 ・-・-・
  3 4

よろしくお願いいたします。

補足日時:2014/07/24 19:31
    • good
    • 0
この回答へのお礼

No.3の補足の通りです。

お礼日時:2014/07/27 16:33

うろ覚えだけど, 最長パスは NP困難じゃなかったかなぁ....

    • good
    • 0
この回答へのお礼

回答ありがとうございます。

探してる途中でNP困難であるという記述はどこかで見ました。
ただ、グラフが小さいのでそれでも現実的な時間でとけるのではないかな、と思っています。

お礼日時:2014/07/24 19:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!