1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| class Graph {
int n; int inf = Integer.MAX_VALUE >> 2; int[][] dp;
public Graph(int n, int[][] edges) { this.n = n; dp = new int[n][n]; for (int[] arr : dp) Arrays.fill(arr, inf); for (int i = 0; i < n; ++i) dp[i][i] = 0; for (int[] edge : edges) dp[edge[0]][edge[1]] = edge[2]; for (int k = 0; k < n; ++k) for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) dp[i][j] = Math.min(dp[i][j], dp[i][k] + dp[k][j]); }
public void addEdge(int[] edge) { int x = edge[0], y = edge[1], w = edge[2]; if (w >= dp[x][y]) return; dp[x][y] = w; for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) dp[i][j] = Math.min(dp[i][j], dp[i][x] + dp[x][y] + dp[y][j]); }
public int shortestPath(int from, int to) { return dp[from][to] < inf ? dp[from][to] : -1; } }
|