diff --git a/Labs/Lab4/src/main.py b/Labs/Lab4/src/main.py new file mode 100644 index 0000000..800963a --- /dev/null +++ b/Labs/Lab4/src/main.py @@ -0,0 +1,38 @@ +INF = float('inf') + +def Dijkstra(G, origin): + node_num = len(G) + vis = [False] * node_num + dis = [G[origin][node] for node in range(node_num)] + paths = [[]] * node_num + paths[origin].append(origin) + vis[origin] = True + last_point = origin + for i in range(node_num - 1): + min_dis = INF + for j in range(node_num): + if not vis[j] and dis[j] < min_dis: + min_dis = dis[j] + last_point = j + vis[last_point] = True + if i == 0: + paths[last_point] = paths[origin] + [last_point] + for k in range(node_num): + if G[last_point][k] < INF and dis[k] > dis[last_point] + G[last_point][k]: + dis[k] = dis[last_point] + G[last_point][k] + paths[k] = paths[last_point] + [k] + + return dis, paths + + +if __name__ == '__main__': + G = [[0, 1, 12, INF, INF, INF], + [INF, 0, 9, 3, INF, INF], + [INF, INF, 0, INF, 5, INF], + [INF, INF, 4, 0, 13, 15], + [INF, INF, INF, INF, 0, 4], + [INF, INF, INF, INF, INF, 0]] + origin = 0 + dis, paths = Dijkstra(G, origin) + for i in range(len(G)): + print(f"{origin} to {i}", "path:", paths[i], f"distance: {dis[i]}") \ No newline at end of file