एक ग्राफ में सबसे छोटा रास्ता


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
हाँ, आपको ग्राफ़ निर्दिष्ट करना होगा जैसा कि मैंने निर्दिष्ट किया है। यह वास्तव में समस्या है। सबसे छोटा पथ हिस्सा सिर्फ यह सुनिश्चित करता है कि आपका पार्सिंग सही है।
कीथ रान्डेल

3
इनपुट प्रारूप वास्तव में बहुत जटिल है और imho वास्तव में समस्या के लिए इतना नहीं जोड़ता है।
JPvdMerwe

1
बस सोचा यहाँ लोग कुछ और अधिक चुनौतीपूर्ण कुछ करने की कोशिश करना चाहते हैं।
कीथ रान्डेल

2
@SimpleCoder: मैं
मानस को मानूँगा

जवाबों:


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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.