79 lines
2.7 KiB
Python
79 lines
2.7 KiB
Python
"""
|
|
BFS graph using Adjecency List
|
|
-----------------------------------------------------------------------------------------
|
|
-In Breadth First Search Sequence of any graph all children of a parent node
|
|
is visited first and the children are stored in the QUEUE array and
|
|
VISITED array.
|
|
-Children of nodes in QUEUE are visited one by one and stored in the QUEUE and
|
|
VISITED as well.
|
|
-When all children of a node is visited that node is removed from the QUEUE.
|
|
-These steps are repeated till all nodes in QUEUE are exhausted.
|
|
-----------------------------------------------------------------------------------------
|
|
-VISITED array is required to check if a node is already in BFS sequence or not.
|
|
-QUEUE array is important for ensuring that all nodes and edges are visited.
|
|
------------------------------------------------------------------------------------------
|
|
The sequence of nodes printed in every recursion is the BFS-SEQUENCE
|
|
------------------------------------------------------------------------------------------
|
|
"""
|
|
def ShowGraph(Adj_Dict: dict[int, list[int]])->None : #displays graph
|
|
for i in Adj_Dict:
|
|
print(i,"->",Adj_Dict[i])
|
|
return
|
|
def Display_BFS(curr:int ,Adj_Dict: dict[int, list[int]]) -> None: # displays BFS sequence
|
|
global rear
|
|
global front
|
|
print(curr,end=" ")
|
|
if curr in Adj_Dict :
|
|
if curr not in visited:
|
|
visited.append(curr)
|
|
queue.append(curr)
|
|
rear+=1
|
|
for i in Adj_Dict[curr]: # iterate over all neighbours of curr
|
|
if i not in visited:
|
|
queue.append(i)
|
|
visited.append(i)
|
|
rear+=1
|
|
queue[front]=-1 # all nodes adjecent to curr are visited
|
|
front+=1
|
|
if front==rear: # no new node to visit
|
|
return
|
|
else:
|
|
Display_BFS(queue[front],Adj_Dict) # go to next node
|
|
return
|
|
|
|
#__main__
|
|
#Dry Run
|
|
queue: list[int]=[]#: list[int]=[] #keeps order of BFS tree
|
|
visited: list[int]=[] #: list[int]=[] #keeps visited node
|
|
# front and rear for accessing queue
|
|
front=0
|
|
rear=0
|
|
#g is an adjecency list in form of dictionary
|
|
g={1:[2,4],2:[4,5],4:[7,5],5:[1,3,6],6:[3,8],8:[7]} # this is directed graph
|
|
# for undirected graph each edge has to be given twice
|
|
# Eg:- edge from 1-2 input as {1:[2]}
|
|
print("Display Graph")
|
|
ShowGraph(g)
|
|
print("BFS Sequence")
|
|
Display_BFS(1,g) #passing start node
|
|
'''
|
|
---------------------------------
|
|
OUTPUT:-
|
|
Display Graph
|
|
1 -> [2, 4]
|
|
2 -> [4, 5]
|
|
4 -> [7, 5]
|
|
5 -> [3, 1, 6]
|
|
6 -> [8, 3]
|
|
8 -> [7]
|
|
BFS Sequence
|
|
1 2 4 5 7 3 6 8
|
|
----------------------------------
|
|
TIME COMPLEXITY:
|
|
-O(V+E) where V and E are number
|
|
of vertices and edges in graph
|
|
respectively.
|
|
-For Adjecency List Only!
|
|
----------------------------------
|
|
'''
|