-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWeighted_Graph.py
More file actions
128 lines (83 loc) · 3.42 KB
/
Weighted_Graph.py
File metadata and controls
128 lines (83 loc) · 3.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import heapq
class Graph:
def __init__(self, directed = False):
self.graph = {}
self.directed = directed
def add_node(self, node):
if node not in self.graph:
self.graph[node] = []
def add_edge(self, node1, node2, weight):
if node1 in self.graph and node2 in self.graph:
self.graph[node1].append((node2, weight))
if not self.directed:
self.graph[node2].append((node1, weight))
def remove_edge(self, node1, node2):
if node1 in self.graph and node2 in self.graph:
self.graph[node1] = [(n, w) for n, w in self.graph[node1] if n!= node2]
if not self.directed:
self.graph[node2] = [(n, w) for n, w in self.graph[node2] if n != node1]
def remove_node(self, node):
if node in self.graph:
for neighbor, _ in self.graph[node]:
self.graph[neighbor] = [(n, w) for n, w in self.graph[neighbor] if n != node]
del self.graph[node]
def BFS(self, start):
visited = set()
queue = [start]
result = []
while queue:
node = queue.pop(0)
if node not in visited:
visited.add(node)
result.append(node)
for neighbor, _ in self.graph[node]:
if neighbor not in visited:
queue.append(neighbor)
return result
def DFS(self, start):
visited = set()
stack = [start]
result = []
while stack:
node = stack.pop()
if node not in visited:
visited.add(node)
result.append(node)
for neighbor, _ in reversed(self.graph[node]):
if neighbor not in visited:
stack.append(neighbor)
return result
def djkstra(self, start):
if start not in self.graph:
return {}
distances = {node: float('inf') for node in self.graph}
distances[start] = 0
heap = [(0, start)]
while heap:
curr_dist, curr_node = heapq.heappop(heap)
if curr_dist > distances[curr_node]:
continue
for neighbor, weight in self.graph[curr_node]:
distance = curr_dist + weight
if distance < distances[neighbor]:
distances[neighbor] = distance
heapq.heappush(heap, (distance, neighbor))
return distances
def display(self):
for node, edges in self.graph.items():
print(f"{node}: {edges}")
if __name__ == "__main__":
g = Graph()
g.add_node("A")
g.add_node("B")
g.add_node('C')
g.add_node('D')
g.add_edge('A', 'B', 5)
g.add_edge('A', 'C', 3)
g.add_edge('B', 'C', 2)
g.add_edge('A', 'D', 4)
g.remove_edge('A', 'C')
g.display()
print(g.BFS('A'))
print(g.DFS('A'))
print(g.djkstra('A'))