import networkx as nx
import copy
def dijskrtas(G, source_node):
#initailize distances
distance = {}
nodes = G.nodes()
for x in nodes:
#distance to all other nodes is infinity
distance[x] = {'node_name': x, 'distance': float("inf"), 'next_hop': None}
#distance to source node is 0
distance[source_node] = {'node_name': source_node,'distance': 0,'next_hop': source_node};
visited_nodes = {}
unvisited_nodes = copy.copy(distance)
while(len(unvisited_nodes) > 0):
min_dist = float('inf')
min_node = None
#get node with minimum distance
for x in unvisited_nodes.values():
if(x['distance'] == float('inf')):
continue
if x['distance'] <= min_dist:
min_dist = x['distance']
min_node = x['node_name']
next_hop = x['next_hop']
if (min_node not in visited_nodes):
visited_nodes[min_node] = [next_hop]
for x in G.neighbors(min_node):
if(x in visited_nodes):
continue
if(min_dist + G[min_node][x]['weight'] < unvisited_nodes[x]['distance']):
unvisited_nodes[x]['distance'] = min_dist + G[min_node][x]['weight']
unvisited_nodes[x]['node_name'] = x
unvisited_nodes[x]['next_hop'] = x if min_node == source_node else next_hop
distance[min_node] = unvisited_nodes[min_node]
del unvisited_nodes[min_node]
return distance
if __name__ == '__main__':
G = nx.Graph()
G.add_nodes_from([1,2,3,4,5,6])
G.add_edges_from([(1,2,{'weight':3}),(1,3,{'weight':5}),(2,3,{'weight':1}),(2,4,{'weight':4}),(2,6,{'weight':5}),(3,4,{'weight':3}),(3,5,{'weight':7}),(4,5,{'weight':2}),(4,6,{'weight':8})])
d = dijskrtas(G, 1)
print(str(d))