코딩테스트 그래프 문제에서 자주 나오는 개념이라 한번 정리해보자
다이나믹 프로그래밍(DP; Dynamic Programming)
의 특징을 이용2차원 인접행렬을 구성한다.
모든 노드를 돌며 중간노드로 하였을때 위의 점화식을 통해 업데이트 한다.
0
초기화주어진 조건 값 중 가장 큰 값 + 1
으로 초기화// 노드의 개수 n
// 2차원 간선 배열 adjs {{시작, 도착, 가중치}, ...}
int[][] dist = new int[n + 1][n + 1];
for (int i = 1; i < dist.length; i++) {
for (int j = 1; j < dist[0].length; j++) {
if (i != j) {
dist[i][j] = Integer.MAX_VALUE;
}
}
}
for (int[] adj : adjs) {
dist[adj[0]][adj[1]] = adj[3];
// 방향 없을 경우
// dist[adj[1]][adj[0]] = adj[3];
}
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (distance[i][j] > distance[i][k] + distance[k][j]) {
distance[i][j] = distance[i][k] + distance[k][j];
}
}
}
}
0
초기화// 노드의 개수 n
// 2차원 간선 배열 adjs {{시작, 도착, 가중치}, ...}
int[][] dist = new int[n + 1][n + 1];
for (int[] adj : adjs) {
dist[adj[0]][adj[1]] = 1;
// 방향 없을 경우
// dist[adj[1]][adj[0]] = 1;
}
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j < n; j++) {
if (distance[i][k] == 1 && distance[k][j] == 1) {
distance[i][j] = 1;
}
}
}
}