From 938778bfa945ee301a4079d9da9a97d0bac66b5d Mon Sep 17 00:00:00 2001 From: typingbugs Date: Sat, 8 Jun 2024 16:30:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=AE=9E=E9=AA=8C4=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Labs/Lab4/src/main.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 Labs/Lab4/src/main.py 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