그래프에서 최단 경로


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 바이트 인 경우 쉼표를 생략 할 수 있습니다.)
Thomas O

1
예, 지정한대로 그래프를 구문 분석해야합니다. 그것은 실제로 대부분의 문제입니다. 가장 짧은 경로 부분은 구문 분석이 올바른지 확인합니다.
Keith Randall

3
입력 형식은 실제로 너무 복잡하며 imho는 실제로 문제에 그다지 많은 것을 추가하지 않습니다.
JPvdMerwe

1
여기서 사람들은 좀 더 도전적인 것을 시도하고 싶다고 생각했습니다.
Keith Randall

2
@SimpleCoder : 나는 고정 폭 생각할 겁니다
JPvdMerwe

답변:


5

다음은 파이썬에서 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.