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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

アルゴリズム

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Q&A

解決済

1回答

3725閲覧

ダイクストラ法を用いた条件付き単一始点最短経路問題の処理高速化について AOJ 1058

tomatosan

総合スコア12

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

アルゴリズム

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

1グッド

1クリップ

投稿2016/08/05 08:15

お世話になっております。

AOJ 1058 Winter Bells
こちらの問題についてpython3で実装を行ったのですが、何度やってもTLEになってしまいます。
基本的な解法はあってるとは思うのですが、最適な解き方とは自分でも思えず、色んな部分にボトルネックがありそうです。
ただ、どうしても自分ではどこをどう直せば改善するかわからないので、ご教授願えないでしょうか。
よろしくお願い致します。

下記にコードを記述します。
日本語コメントを記載していますが、削除しないとAOJ上ではランタイムエラーになります。

python

1vertex,edge,children = (int(n) for n in input().split(' ')) 2while True: 3 if children == 0: 4 print(0) 5 vertex,edge,children = (int(n) for n in input().split(' ')) 6 if vertex == 0 and edge == 0 and children == 0: 7 break 8 else: 9 continue 10 graph = [] 11 child = [] 12 for e in range(edge): 13 graph.append([int(n) for n in input().split(' ')]) 14 for c in range(children): 15 child.append(int(input())) 16 stack = [[0,0,[]]] 17 root = [] 18 destination = [] 19 mindist = {} 20 destnum = 0 21 childnum = {} 22 while len(stack) > 0: 23 stack = sorted(stack,key = lambda x:x[1]) 24 start,weight,dream = stack[0][0],stack[0][1],stack[0][2] 25#最短経路より重みが大きい物は枝刈り 26 if stack[0][0] in root and weight > mindist[stack[0][0]]: 27 stack.pop(0) 28 continue 29#最終地点の最短経路の重みより大きいスタックになった時点で終了 30 elif mindist.get(vertex-1) != None and stack[0][1] > mindist[vertex - 1]: 31 break 32 33 for gr in graph: 34#現在地点の頂点と辺の始点が一致していて最短経路が判明していないもの 35 if gr[0] == start and gr[0] not in root: 36#経路上で子供が見ているかどうかの計算 37 if gr[1] not in child: 38 stack.append([gr[1],weight + gr[2],dream]) 39 elif gr[1] in child and gr[1] not in dream: 40 disp = dream.copy() 41 disp.append(gr[1]) 42 stack.append([gr[1],weight + gr[2],disp]) 43#現在地点の頂点と辺の始点が一致する且つ最短経路が判明していてその最短経路 44#の重みと等しい物 45 elif gr[0] == start and mindist.get(gr[0]) != None and weight == mindist[gr[0]]: 46 47#経路上で子供が見ているかどうかの計算 48 49 if gr[1] in child: 50 disp = dream.copy() 51 disp.append(gr[1]) 52 stack.append([gr[1],weight + gr[2],disp]) 53 else: 54 stack.append([gr[1],weight + gr[2],dream]) 55#最短経路が判明したものの追加 56 if stack[0][0] not in root: 57 root.append(stack[0][0]) 58 mindist[stack[0][0]] = stack[0][1] 59#最終地点に到着したスタックについての計算 60 if stack[0][0] == vertex - 1 : 61 destination.append(stack[0]) 62 destnum += 1 63 for c in range(len(stack[0][2])): 64 if childnum.get(stack[0][2][c]) == None: 65 childnum[stack[0][2][c]] = 1 66 else: 67 childnum[stack[0][2][c]] += 1 68 stack.pop(0) 69 for c in child: 70 if c == 0: 71 print(1) 72 else: 73 if childnum.get(c) == None: 74 print(0) 75 else: 76 print(childnum[c] / destnum) 77 print("") 78 vertex,edge,children = (int(n) for n in input().split(' ')) 79 if vertex == 0 and edge == 0 and children == 0: 80 break
mpyw👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

時間があればもう少し問題文とコードを読み直してからコメントします。

今一番気になっているのが

python

1for gr in graph:

ここです。ループで毎回全ての辺を見に行きます。

python

1gr[0] == start

以外は捨てているわけなので、これは、graph を構築する際に、単一の巨大な配列としてではなく、始点別に終点を保持する形の配列として持つべきでしょう。

また、問題文で「重み付き無向グラフ」と書いてありましたが、こちらは大丈夫でしょうか。

投稿2016/08/19 23:44

takotakot

総合スコア1111

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問