Leetcode Java Design Graph With Shortest Path Calculator
업데이트:
문제
코드
class Graph {
private int n;
private int[][] costs;
public Graph(int n, int[][] edges) {
this.costs = new int[n][n];
this.n = n;
for (int[] a : this.costs) {
Arrays.fill(a, (int) 1e9);
}
for (int[] e : edges) {
this.costs[e[0]][e[1]] = e[2];
}
for (int i = 0; i < n; i++) {
this.costs[i][i] = 0;
}
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
this.costs[i][j] = Math.min(this.costs[i][j], this.costs[i][k] + this.costs[k][j]);
}
}
}
}
public void addEdge(int[] e) {
for (int i = 0; i < this.n; i++) {
for (int j = 0; j < this.n; j++) {
this.costs[i][j] = Math.min(this.costs[i][j], this.costs[i][e[0]] + this.costs[e[1]][j] + e[2]);
}
}
}
public int shortestPath(int node1, int node2) {
if (this.costs[node1][node2] >= (int) 1e9) {
return -1;
} else {
return this.costs[node1][node2];
}
}
}
/**
* Your Graph object will be instantiated and called as such:
* Graph obj = new Graph(n, edges);
* obj.addEdge(edge);
* int param_2 = obj.shortestPath(node1,node2);
*/
결과
설명
- [0, $n - 1$]까지 노드간 최단 길이를 찾을 수 있는 Graph 객체를 완성하는 문제이다.
- edge[i] = [fromi, toi, edgeCosti]로, fromi에서 toi로 가는데 걸리는 비용이 edgeCosti임을 나타낸다.
- 생성자인 Graph(int n, int[][] edges)는, n과 edges를 이용하여 Graph 객체를 초기화하는 역할을 수행한다.
- 메서드인 addEdge(int[] edge)는, 이전까지 존재하지 않는 edge를 Graph 객체에 추가하는 역할을 수행한다.
- 메서드인 shortestPath(int node1, int node2)는, node1부터 node2까지 가장 짧은 비용을 반환하는 역할을 수행한다. 단, 경로가 존재하지 않으면 -1을 반환한다.
- Graph의 객체에 필요한 전역 변수를 정의한다.
- n은 노드의 갯수를 저장할 변수이다.
- costs는 노드 간 비용을 저장할 변수이다.
- 생성자인 Graph(int n, int[][] edges)를 초기화한다.
- n을 전역 변수 n에 넣어준다.
- 전역 변수 cost에 한 노드에서 다른 노드로 이동하기 위한 비용을 저장하기 위해서, 2차원 배열로 초기화하고 모든 값에 노드 간 길이의 상한값인 $10^9$를 넣어준다.
- costs의 내 모든 노드가 자기 자신의 노드로 이동하는 costs[i, i]에 0을 넣어준다.
- k, i, j 순으로 0부터 n 미만까지 k, i, j를 각각 증가시키며 아래를 반복한다.
- costs[i][j]에 자기 자신의 값과 $cost[i][k] + cost[k][j]$인 k를 경유하고 이동한 값 중 가장 작은 값을 넣어준다.
- 메서드인 addEdge(int[] edge)를 초기화한다.
- i, j 순으로 0부터 n 미만까지 i, j를 각각 증가시키며 아래를 반복한다.
- costs[i][j]에 자기 자신의 값과 $costs[i][e[0]] + csts[e[1]][j] + e[2]$인 엣지 라인을 경유하고 가는 경우의 비용 중 작은 값을 넣어주낟.
- i, j 순으로 0부터 n 미만까지 i, j를 각각 증가시키며 아래를 반복한다.
- 메서드인 shortestPath(int node1, int node2)를 초기화한다.
- costs[node1][node2]가 $10^9$보다 큰 경우, 루트가 존재하지 않으므로 -1을 반환한다.
- 위의 경우가 아니라면 costs[node1][node2]의 비용을 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기