グラフの最短経路


12

プログラムを作成して、グラフを(標準入力または選択したファイルから)取得し、グラフ内の最短パスを見つけます。

グラフは、次の形式を使用して指定されます。

A---S   F--T
|  / \  |
| /   5 0
|/     \|
D----3--E

    A-Z: nodes in the graph
   -|/\: edges in the graph
    0-9: weights on the edges
<space>: all the holes

すべてのエッジは無方向で、8つの基本方向のいずれかに沿って配置されます(つまり、曲がりません)。エッジには、オプションで0〜9の重みを含めることができます。重みは、エッジをノードに接続する最後のシンボルにはありません(つまり、エッジには、重みを含めるために少なくとも3つのシンボルが必要です)。重みなしエッジのデフォルトの重みは1です。

コードは、ノード間の最短経路を計算する必要がありSそしてT長さおよび経路を印刷し、このように:

5:SDEFT

最短の正しいプログラムが勝ちます。


1
グラフ図を解析する必要がありますか、独自の形式を使用できますか?: -フォーマットの一例は、グラフは以下のように表すことができるAS0,SD0,SE5,DE3,FE0,FT0(各エントリは長い3バイトである場合は、カンマを省略することができます。)
トーマス・O

1
はい、指定したとおりにグラフを解析する必要があります。実際のところ、それが問題のほとんどです。最短パス部分は、解析が正しいことを確認するだけです。
キースランドール

3
入力フォーマットは実際には非常に複雑であり、imhoは実際にはそれほど問題を追加しません。
-JPvdMerwe

1
ここの人々はもう少し挑戦的なことを試してみたいと思っただけです。
キースランドール

2
@SimpleCoder:モノスペースと仮定します
-JPvdMerwe

回答:


5

これが私のコード、Pythonの494文字です。

import sys,re
m=sys.stdin.readlines()
Z=lambda c,s:re.findall(r'(\w)%s+(\d*)[^\w]*(\w)'%c,''.join(x*2for x in s))
T=lambda n:''.join(x for a in map(None,*n)for x in a if x)
E=Z('-',''.join(m))+Z('\\|',T(m))+Z('/',T(' '*m.index(s)+s for s in m))+Z('\\\\',T(' '*m[::-1].index(s)+s for s in m))
E+=[x[::-1]for x in E]
S={}
for x in E:S[x[0]]=1e9
S['S']=0
P={}
for i in E:
 for x,w,y in E:
  w=int('1'+w)%10
  if S[y]>S[x]+w:S[y]=S[x]+w;P[y]=x
i=p='T'
while i!='S':i=P[i];p=i+p
print'%d:'%S['T']+p
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.