mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-30 16:31:08 +00:00
Update queue implementation (#5388)
* Update queue implementation Popping the first element of a list takes O(n) time. Using a cyclic queue takes O(1) time. * Add queue changes from extra files * Update indentation * Add empty line between imports * Fix lines * Apply suggestions from code review Co-authored-by: John Law <johnlaw.po@gmail.com> Co-authored-by: John Law <johnlaw.po@gmail.com>
This commit is contained in:
parent
3a4cc7e310
commit
e6cf13cc03
|
@ -3,6 +3,8 @@
|
|||
""" Author: OMKAR PATHAK """
|
||||
from __future__ import annotations
|
||||
|
||||
from queue import Queue
|
||||
|
||||
|
||||
class Graph:
|
||||
def __init__(self) -> None:
|
||||
|
@ -51,19 +53,19 @@ class Graph:
|
|||
visited = set()
|
||||
|
||||
# create a first in first out queue to store all the vertices for BFS
|
||||
queue = []
|
||||
queue = Queue()
|
||||
|
||||
# mark the source node as visited and enqueue it
|
||||
visited.add(start_vertex)
|
||||
queue.append(start_vertex)
|
||||
queue.put(start_vertex)
|
||||
|
||||
while queue:
|
||||
vertex = queue.pop(0)
|
||||
while not queue.empty():
|
||||
vertex = queue.get()
|
||||
|
||||
# loop through all adjacent vertex and enqueue it if not yet visited
|
||||
for adjacent_vertex in self.vertices[vertex]:
|
||||
if adjacent_vertex not in visited:
|
||||
queue.append(adjacent_vertex)
|
||||
queue.put(adjacent_vertex)
|
||||
visited.add(adjacent_vertex)
|
||||
return visited
|
||||
|
||||
|
|
|
@ -14,6 +14,8 @@ while Q is non-empty:
|
|||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
from queue import Queue
|
||||
|
||||
G = {
|
||||
"A": ["B", "C"],
|
||||
"B": ["A", "D", "E"],
|
||||
|
@ -30,13 +32,14 @@ def breadth_first_search(graph: dict, start: str) -> set[str]:
|
|||
'ABCDEF'
|
||||
"""
|
||||
explored = {start}
|
||||
queue = [start]
|
||||
while queue:
|
||||
v = queue.pop(0) # queue.popleft()
|
||||
queue = Queue()
|
||||
queue.put(start)
|
||||
while not queue.empty():
|
||||
v = queue.get()
|
||||
for w in graph[v]:
|
||||
if w not in explored:
|
||||
explored.add(w)
|
||||
queue.append(w)
|
||||
queue.put(w)
|
||||
return explored
|
||||
|
||||
|
||||
|
|
|
@ -6,14 +6,17 @@
|
|||
# from V to U. In other words, for every edge (u, v), either u belongs to U and v to V,
|
||||
# or u belongs to V and v to U. We can also say that there is no edge that connects
|
||||
# vertices of same set.
|
||||
from queue import Queue
|
||||
|
||||
|
||||
def checkBipartite(graph):
|
||||
queue = []
|
||||
queue = Queue()
|
||||
visited = [False] * len(graph)
|
||||
color = [-1] * len(graph)
|
||||
|
||||
def bfs():
|
||||
while queue:
|
||||
u = queue.pop(0)
|
||||
while not queue.empty():
|
||||
u = queue.get()
|
||||
visited[u] = True
|
||||
|
||||
for neighbour in graph[u]:
|
||||
|
@ -23,7 +26,7 @@ def checkBipartite(graph):
|
|||
|
||||
if color[neighbour] == -1:
|
||||
color[neighbour] = 1 - color[u]
|
||||
queue.append(neighbour)
|
||||
queue.put(neighbour)
|
||||
|
||||
elif color[neighbour] == color[u]:
|
||||
return False
|
||||
|
@ -32,7 +35,7 @@ def checkBipartite(graph):
|
|||
|
||||
for i in range(len(graph)):
|
||||
if not visited[i]:
|
||||
queue.append(i)
|
||||
queue.put(i)
|
||||
color[i] = 0
|
||||
if bfs() is False:
|
||||
return False
|
||||
|
|
Loading…
Reference in New Issue
Block a user