import highspy
import networkx as nx
orig, dest = ('A', 'D')
G = nx.DiGraph()
G.add_weighted_edges_from([('A', 'B', 2.0), ('B', 'C', 3.0), ('A', 'C', 1.5), ('B', 'D', 2.5), ('C', 'D', 1.0)])
h = highspy.Highs()
h.silent()
x = h.addBinaries(G.edges, obj=nx.get_edge_attributes(G, 'weight'))
rhs = lambda n: 1 if n == orig else -1 if n == dest else 0
flow = lambda E: h.qsum((x[e] for e in E))
h.addConstrs(flow(G.out_edges(n)) - flow(G.in_edges(n)) == rhs(n) for n in G.nodes)
h.minimize()
print('Shortest path from', orig, 'to', dest, 'is: ', end = '')
sol = h.vals(x)
n = orig
while n != dest:
print(n, end=' ')
n = next(e[1] for e in G.out_edges(n) if sol[e] > 0.5)
print(dest)