เส้นทางที่สั้นที่สุดในกราฟ


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 ไบต์ยาว.)
โทมัสโอ

1
ใช่คุณต้องแยกวิเคราะห์กราฟตามที่ฉันระบุ นั่นเป็นปัญหาที่เกิดขึ้นจริง ส่วนเส้นทางที่สั้นที่สุดเพียงตรวจสอบให้แน่ใจว่าการแยกวิเคราะห์ของคุณถูกต้อง
Keith Randall

3
รูปแบบอินพุตนั้นซับซ้อนเกินไปและอิโมไม่ได้เพิ่มปัญหาให้
JPvdMerwe

1
แค่คิดว่าคนที่นี่อยากลองอะไรที่ท้าทายมากกว่านี้
Keith Randall

2
@SimpleCoder: ฉันจะสันนิษฐาน monospace
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.