-
Notifications
You must be signed in to change notification settings - Fork 0
/
WeighedGraph.py
123 lines (94 loc) · 2.51 KB
/
WeighedGraph.py
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
from collections import deque
def dfs(graph, current, target, visited=set()):
if current not in visited:
visited.add(current)
if current == target:
return True
else:
nexts = get_neighbours(graph, current)
return True in [dfs(graph, node, target, visited) for node in nexts]
return False
def bfs(graph, start, target):
visited = set()
next = deque(get_neighbours(graph, start))
visited.add(start)
while next:
current = next.popleft()
if current == target:
return True
else:
visited.add(current)
[next.append(node) for node in get_neighbours(graph, current) if node not in visited]
return False
def add_edge(graph, edge, weight):
edge = set(edge)
node1 = edge.pop()
if edge:
node2 = edge.pop()
else:
node2 = node1
graph[node1][node2] = weight
def add_node(graph, node):
if node not in graph:
graph[node] = {}
def get_neighbours(graph, node):
nodes = []
if node in graph:
for neighbour in graph[node]:
if neighbour not in nodes:
nodes.append(neighbour)
return nodes
def get_neighbours_edges(graph, node):
edges = dict()
if node in graph:
edges = graph[node]
return edges
def get_edges(graph):
edges = []
for node1 in graph:
for node2 in graph[node1]:
edges.append([node1, node2, graph[node1][node2]])
return edges
def edges_to_graph(edges):
graph = dict()
for edge in edges:
weight = edge.pop()
node1 = edge.pop()
if node1 not in graph:
add_node(graph, node1)
if edge:
node2 = edge.pop()
if node2 not in graph:
add_node(graph, node2)
else:
node2 = node1
graph[node2][node1] = weight
return graph
def to_string(graph):
res = "Graph :\n"
for k in graph:
res += str(k) + " : " + str(graph[k]) + "\n"
return res
G = {'a': {'b': 4, 'c': 2},
'b': {'a': 4, 'c': 1},
'c': {'a': 2}}
E = [['A', 'B', 3],
['A', 'C', 5],
['B', 'C', 6],
['B', 'D', 7],
['C', 'D', 1],
['D', 'C', 2],
['E', 'F', 3],
['F', 'C', 5]]
print(len(G))
add_edge(G, ['c', 'b'], 10)
add_edge(G, ['a', 'a'], 5)
print(get_neighbours(G, 'c'))
add_node(G, 'z')
print(to_string(G))
H = edges_to_graph(E)
print(to_string(H))
print(bfs(H, 'A', 'F'))
print(get_edges(H))
E = get_edges(H)
print(*E, sep='\n')