質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

0回答

1137閲覧

トポロジカルソートを使って,最も長くなるような経路を求める

Q3fdxrGzWzu0u5n

総合スコア8

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/08/07 06:38

編集2020/08/07 07:36

辺に重みのあるサイクルのない有効グラフの点Aから点Bへの経路で最も経路が長くなるような経路を求めたいです.
有効グラフをトポロジカルソートして,左から右に順に順次一番短くできる経路を決定していき,AからBまでの距離の和のうち最大のものを選択していこうと考えています.

javascript

1function init_graph(p) { 2 var adj = [] 3 function register(i, j) { 4 adj[i].push(j) 5 } 6 for (var i = 0; i < 36; i++) adj[i] = [] 7 for (var i = 0; i < 36; i++) { 8 var ix = i % 6 9 var iy = Math.floor(i / 6) 10 if (ix > 0 && Math.random() < p) register(i, i - 1) 11 if (ix < 5 && Math.random() < p) register(i, i + 1) 12 if (iy > 0 && Math.random() < p) register(i, i - 6) 13 if (iy < 5 && Math.random() < p) register(i, i + 6) 14 } 15 return adj 16} 17 18// var adj = init_graph(0.6) 19// puts(adj) 20 21function draw_graph(adj) { 22 function coord(i) { 23 var w = 1 / 7 24 var ix = i % 6 25 var iy = Math.floor(i / 6) 26 return [ix * w + w, iy * w + w] 27 } 28 function shift_h(p, d) { 29 var [x, y] = p 30 return [x + d, y] 31 } 32 function shift_v(p, d) { 33 var [x, y] = p 34 return [x, y + d] 35 } 36 function putmark(p) { 37 var [x, y] = p 38 var h = 0.005 39 draw_rect([x - h, y - h], [x + h, y + h]) 40 } 41 function putnode(p) { 42 var d = 0.01 43 var [x, y] = p 44 draw_rect([x - d, y - d], [x + d, y + d]) 45 } 46 cls() 47 var dd = 0.01 48 var mm = 0.02 49 for (var i = 0; i < 36; i++) { 50 var n = adj[i].length 51 putnode(coord(i)) 52 for (var j = 0; j < n; j++) { 53 var next = adj[i][j] 54 if (next - i == 1){ 55 draw_line(shift_h(shift_v(coord(i), dd), mm), 56 shift_h(shift_v(coord(next), dd), -mm)) 57 putmark(shift_h(shift_v(coord(next), dd), -mm)) 58 } 59 if (next - i == -1){ 60 draw_line(shift_h(shift_v(coord(i), -dd), -mm), 61 shift_h(shift_v(coord(next), -dd), mm)) 62 putmark(shift_h(shift_v(coord(next), -dd), mm)) 63 } 64 if (next - i == 6){ 65 draw_line(shift_v(shift_h(coord(i), -dd), mm), 66 shift_v(shift_h(coord(next), -dd), -mm)) 67 putmark(shift_v(shift_h(coord(next), -dd), -mm)) 68 } 69 if (next - i == -6) { 70 draw_line(shift_v(shift_h(coord(i), dd), -mm), 71 shift_v(shift_h(coord(next), dd), mm)) 72 putmark(shift_v(shift_h(coord(next), dd), mm)) 73 } 74 } 75 } 76} 77 78function make_acyclic_graph(adj, start) { 79 var n = adj.length 80 var adj2 = [] 81 var val = [] 82 for (var i = 0; i < n; i++){ 83 adj2.push([]) 84 val[i] = 0 85 } 86 function det(i) { 87 if (val[i] == 0) { 88 val[i] = 1 89 var lst = adj[i] 90 for (var j = 0; j < lst.length; j++) { 91 var k = lst[j] 92 if (val[k] == 0) { 93 det(k) 94 adj2[i].push(k) 95 } else if (val[k] == 2) 96 adj2[i].push(k) 97 } 98 val[i] = 2 99 } 100 } 101 det(start) 102 for (var i = 0; i < n; i++) 103 if (val[i] == 0){ 104 puts(i) 105 det(i) 106 } 107 return adj2 108} 109 110function tsort(adj,A,B) { 111 var n = adj.length 112 //var val = [] 113 var res = [] 114 //for (var i = 0; i < n; i++) val[i] = 0 115 function det(i) { 116 //if (val[i] == 0) { 117 //val[i] = 1 118 var lst = adj[i] 119 for (var j = 0; j < lst.length; j++){ 120 var k = lst[j] 121 if (i != B) det(k) 122 //det(k) 123 } 124 res.unshift(i) 125 //} 126 } 127 det(A) 128 return res 129} 130 131var adj = init_graph(0.7) 132var adj2 = make_acyclic_graph(adj, 0) 133draw_graph(adj2) 134puts(adj2) 135puts(tsort(adj2,0,7))

上記のプログラムは,グラフの作成部分も含まれます.
まだ,各辺に重みをつけていません.
ここで,どのようにしたら,AからBまでの経路を列挙することができ,重みはどのように実装したらいいのかがわからないため,適切なプログラム,アドバイスをお伺いしたいです.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問