classNetwork:def__init__(self,):
self.nodes ={}defadd_node(self, key):if key notin self.nodes:
self.nodes[key]= Node(key, self)else:passdefadd_edge(self, a, b):
self.nodes[a].add_neighbor(b)
self.nodes[b].add_neighbor(a)defget(self, key):if key in self.nodes:return self.nodes[key]else:returnNonedefupdate(self):
if_update =0for k in self.nodes:
if_update += self.nodes[k].update()return if_update !=0classNode:def__init__(self, key, network):
self.network = network
self.key = key
self.routing_table ={key:(0, key)}# {key: (distance, next_node_key)}def_update(self, key):
if_update =False
node = self.network.get(key)for k, v in node.routing_table.items():if k notin self.routing_table:
self.routing_table[k]=(v[0]+1, node.key)
if_update =Trueelse:if self.routing_table[k][0]> v[0]+1:
self.routing_table[k]=(v[0]+1, node.key)
if_update =Truereturn if_update
defupdate(self):
neighbors =[k for k, v in self.routing_table.items()if v[0]==1]
if_update =0for k in neighbors:
if_update += self._update(k)return if_update !=0defadd_neighbor(self, key):
self.routing_table[key]=(1, key)defquery(self, name):pass
net = Network()for i inrange(10):
net.add_node(i)for j inrange(9):
net.add_edge(j, j+1)
max_iter =10while net.update()and max_iter >0:for k in net.nodes:print(k,net.get(k).routing_table)
max_iter -=1