classGraph: def__init__(self, n: int, edges: List[List[int]]): g = [[inf] * n for _ inrange(n)] # 邻接矩阵(初始化为无穷大,表示 i 到 j 没有边) for x, y, w in edges: g[x][y] = w # 添加一条边(输入保证没有重边) self.g = g
# 朴素 Dijkstra 算法 defshortestPath(self, start: int, end: int) -> int: n = len(self.g) dis = [inf] * n # 从 start 出发,到各个点的最短路,如果不存在则为无穷大 dis[start] = 0 vis = [False] * n whileTrue: # 至多循环 n 次 # 找到当前最短路,去更新它的邻居的最短路 # 根据数学归纳法,dis[x] 一定是最短路长度 x = -1 for i, (b, d) inenumerate(zip(vis, dis)): ifnot b and (x < 0or d < dis[x]): x = i if x < 0or dis[x] == inf: # 所有从 start 能到达的点都被更新了 return -1 if x == end: # 找到终点,提前退出 return dis[x] vis[x] = True# 标记,在后续的循环中无需反复更新 x 到其余点的最短路长度 for y, w inenumerate(self.g[x]): if dis[x] + w < dis[y]: dis[y] = dis[x] + w # 更新最短路长度
publicGraph(int n, int[][] edges) { g = newint[n][n]; // 邻接矩阵(初始化为无穷大,表示 i 到 j 没有边) for (inti=0; i < n; ++i) Arrays.fill(g[i], INF); for (var e : edges) g[e[0]][e[1]] = e[2]; // 添加一条边(输入保证没有重边) }
funcConstructor(n int, edges [][]int) Graph { g := make([][]int, n) // 邻接矩阵 for i := range g { g[i] = make([]int, n) for j := range g[i] { g[i][j] = inf // 初始化为无穷大,表示 i 到 j 没有边 } } for _, e := range edges { g[e[0]][e[1]] = e[2] // 添加一条边(输入保证没有重边) } return g }
// 朴素 Dijkstra 算法 func(g Graph) ShortestPath(start, end int) int { n := len(g) dis := make([]int, n) // 从 start 出发,到各个点的最短路,如果不存在则为无穷大 for i := range dis { dis[i] = inf } dis[start] = 0 vis := make([]bool, n) for { // 找到当前最短路,去更新它的邻居的最短路, // 根据数学归纳法,dis[x] 一定是最短路长度 x := -1 for i, b := range vis { if !b && (x < 0 || dis[i] < dis[x]) { x = i } } if x < 0 || dis[x] == inf { // 所有从 start 能到达的点都被更新了 return-1 } if x == end { // 找到终点,提前退出 return dis[x] } vis[x] = true// 标记,在后续的循环中无需反复更新 x 到其余点的最短路长度 for y, w := range g[x] { dis[y] = min(dis[y], dis[x]+w) // 更新最短路长度 } } }
funcmin(a, b int)int { if b < a { return b }; return a }
classGraph: def__init__(self, n: int, edges: List[List[int]]): d = [[inf] * n for _ inrange(n)] for i inrange(n): d[i][i] = 0 for x, y, w in edges: d[x][y] = w # 添加一条边(输入保证没有重边和自环) for k inrange(n): for i inrange(n): for j inrange(n): d[i][j] = min(d[i][j], d[i][k] + d[k][j]) self.d = d
defaddEdge(self, e: List[int]) -> None: d = self.d n = len(d) x, y, w = e if w >= d[x][y]: # 无需更新 return for i inrange(n): for j inrange(n): d[i][j] = min(d[i][j], d[i][x] + w + d[y][j])
defshortestPath(self, start: int, end: int) -> int: ans = self.d[start][end] return ans if ans < inf else -1
publicGraph(int n, int[][] edges) { d = newint[n][n]; // 邻接矩阵(初始化为无穷大,表示 i 到 j 没有边) for (inti=0; i < n; ++i) { Arrays.fill(d[i], INF); d[i][i] = 0; } for (var e : edges) d[e[0]][e[1]] = e[2]; // 添加一条边(输入保证没有重边和自环) for (intk=0; k < n; ++k) for (inti=0; i < n; ++i) for (intj=0; j < n; ++j) d[i][j] = Math.min(d[i][j], d[i][k] + d[k][j]); }
publicvoidaddEdge(int[] e) { intx= e[0], y = e[1], w = e[2], n = d.length; if (w >= d[x][y]) // 无需更新 return; for (inti=0; i < n; ++i) for (intj=0; j < n; ++j) d[i][j] = Math.min(d[i][j], d[i][x] + w + d[y][j]); }
publicintshortestPath(int start, int end) { intans= d[start][end]; return ans < INF / 3 ? ans : -1; } }
classGraph { vector<vector<int>> d; public: Graph(int n, vector<vector<int>> &edges) { // 邻接矩阵(初始化为无穷大,表示 i 到 j 没有边) d = vector<vector<int>>(n, vector<int>(n, INT_MAX / 3)); for (int i = 0; i < n; ++i) d[i][i] = 0; for (auto &e: edges) d[e[0]][e[1]] = e[2]; // 添加一条边(输入保证没有重边和自环) for (int k = 0; k < n; ++k) for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) d[i][j] = min(d[i][j], d[i][k] + d[k][j]); }
voidaddEdge(vector<int> e){ int x = e[0], y = e[1], w = e[2], n = d.size(); if (w >= d[x][y]) // 无需更新 return; for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) d[i][j] = min(d[i][j], d[i][x] + w + d[y][j]); }
intshortestPath(int start, int end){ int ans = d[start][end]; return ans < INT_MAX / 3 ? ans : -1; } };
funcConstructor(n int, edges [][]int) Graph { d := make([][]int, n) // 邻接矩阵 for i := range d { d[i] = make([]int, n) for j := range d[i] { if j != i { d[i][j] = inf // 初始化为无穷大,表示 i 到 j 没有边 } } } for _, e := range edges { d[e[0]][e[1]] = e[2] // 添加一条边(输入保证没有重边和自环) } for k := range d { for i := range d { for j := range d { d[i][j] = min(d[i][j], d[i][k]+d[k][j]) } } } return d }
func(d Graph) AddEdge(e []int) { x, y, w := e[0], e[1], e[2] if w >= d[x][y] { // 无需更新 return } for i := range d { for j := range d { d[i][j] = min(d[i][j], d[i][x]+w+d[y][j]) } } }
func(d Graph) ShortestPath(start, end int) int { ans := d[start][end] if ans == inf { return-1 } return ans }
funcmin(a, b int)int { if b < a { return b }; return a }