A = "A" B = "B" C = "C" #D = "D" E = "E" F = "F" nodes = [A,B,C,E,F] edges = { (A,B,3), (A,C,4), # (B,D,5), (B,E,2), # (C,D,1), # (D,E,2), # (D,F,4), (E,F,6) } def getadjacent(node, edges): adjacent = set() for (s,t,l) in edges: if s == node: adjacent.add( (t,l) ) elif t == node: adjacent.add( (s,l) ) return adjacent def spr(s,t, nodes, edges): nodes = set(nodes) m = { s:(0,[s])} S = set([s]) S2 = set(S) while S < nodes: for s in set(S2): S2.remove( s ) l,p = m[s] for (ad,sl) in getadjacent(s, edges): if ad not in S: m[ad] = (l+sl,p+[ad]) else: ad_l,_ = m[ad] if ad_l > l+sl: m[ad] = (l+sl,p+[ad]) S.add( ad ) S2.add( ad ) return m[t] print( spr(A,F, nodes, edges) )