मान लीजिए कि हमने 0, 1, ..., n-1 लेबल वाले नोड्स के साथ ग्राफ़ निर्देशित किया है। इस ग्राफ़ में, प्रत्येक किनारे को लाल या नीले रंग से रंगा गया है, और स्वयं-किनारे या समानांतर किनारे हो सकते हैं। red_edges में प्रत्येक [i, j] नोड i से नोड j तक एक लाल निर्देशित किनारे को इंगित करता है। इसी तरह, blue_edges में प्रत्येक [i, j] नोड i से नोड j तक एक नीले निर्देशित किनारे को इंगित करता है। हमें लंबाई n का एक सरणी उत्तर खोजना होगा, जहां प्रत्येक उत्तर [X] नोड 0 से नोड X तक के सबसे छोटे पथ की लंबाई है जैसे कि किनारे के रंग पथ के साथ वैकल्पिक होते हैं (या -1 यदि ऐसा पथ नहीं है मौजूद है)।
तो अगर इनपुट n =3, red_edges =[[0,1],[1,2]] और blue_edges =[] जैसा है, तो आउटपुट [0, 1, -1]
होगा।इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
bfs() नामक एक विधि को परिभाषित करें, इसमें re, be, f और n की आवश्यकता होगी
-
विज़िट किए गए सेट को परिभाषित करें, एक कतार को परिभाषित करें और एक ट्रिपल डालें [0, f, 0]
-
जबकि q खाली नहीं है
-
ट्रिपल करंट, रंग, चरण को q[0] के रूप में सेट करें, और q से हटाएं
-
रंग:=रंग के मूल्य का पूरक (सत्य से असत्य और इसके विपरीत)
-
रेस [वर्तमान] :=मिनट का रेस [वर्तमान] और चरण
-
अगर रंग शून्य नहीं है, तो
-
प्रत्येक के लिए मैं फिर से [वर्तमान]
-
यदि जोड़ी (i, रंग) का दौरा नहीं किया गया है, तो विज़िट में (i, रंग) डालें और [i, रंग, चरण + 1] को q
में डालें
-
-
-
अन्यथा जब रंग 0 हो, तब
-
प्रत्येक मैं के लिए [वर्तमान]
-
यदि जोड़ी (i, रंग) का दौरा नहीं किया गया है, तो विज़िट में (i, रंग) डालें और [i, रंग, चरण + 1] को q
में डालें
-
-
-
-
मुख्य विधि में -
-
res :=अनंत मानों की एक सरणी और इसका आकार n है
-
फिर से और हो:=n खाली सरणियों के सरणियाँ
-
प्रत्येक तत्व के लिए मैं r में:i[1] को पुनः [i[0]]
. में सम्मिलित करता हूं -
b में प्रत्येक तत्व के लिए:i[1] को be[i[0]]
. में डालें -
कॉल bfs(re, be, false, n) और कॉल bfs(re, be, true, n)
-
मैं के लिए 0 से लेकर रेस की लंबाई तक -1
-
अगर res[i] =inf, तो res[i] :=-1
-
-
रिटर्न रेस
उदाहरण (पायथन)
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
class Solution(object):
def shortestAlternatingPaths(self, n, r, b):
self.res = [float("inf")] * n
re = [[] for i in range(n) ]
be = [[] for i in range(n) ]
for i in r:
re[i[0]].append(i[1])
for i in b:
be[i[0]].append(i[1])
self.bfs(re,be,False,n)
self.bfs(re,be,True,n)
for i in range(len(self.res)):
if self.res[i] == float('inf'):
self.res[i]=-1
return self.res
def bfs(self,re,be,f,n):
visited = set()
queue = [[0,f,0]]
while queue:
current,color,step = queue[0]
queue.pop(0)
color = not color
self.res[current] = min(self.res[current],step)
if color:
for i in re[current]:
if (i,color) not in visited:
visited.add((i,color))
queue.append([i,color,step+1])
elif not color:
for i in be[current]:
if (i,color) not in visited:
visited.add((i,color))
queue.append([i,color,step+1])
ob = Solution()
print(ob.shortestAlternatingPaths(3, [[0,1], [1,2]], [])) इनपुट
3 [[0,1],[1,2]] []
आउटपुट
[0,1,-1]