플로이드-워셜 예제 - 1
Last updated
Last updated
n(도시 개수)
m(노선 개수)
distance(인접 행렬) # 큰 값으로 초기화
for 1~n 반복:
인접 행렬에 시작 도시와 종료 도시가 같은 자리에 0 저장
for m 반복:
노선 데이터 인접 행렬에 저장
for k n반복:
for s n반복:
for e n 반복:
distance[s][e]보다 distance[s][k] + distance[k][e]가 작으면 업데이트
정답 리스트 출력import sys
input = sys.stdin.readline
n = int(input())
m = int(input())
distance = [[sys.maxsize for _ in range(n + 1)] for _ in range(n + 1)]
for i in range(1, n + 1):
distance[i][i] = 0
for i in range(m):
start, end, v = map(int, input().split())
if distance[start][end] > v: # 노선이 여러개 일 때 비용이 더 적은 정보 저장
distance[start][end] = v
for k in range(1, n + 1):
for s in range(1, n + 1):
for e in range(1, n + 1):
if distance[s][e] > distance[s][k] + distance[k][e]:
distance[s][e] = distance[s][k] + distance[k][e]
for i in range(1, n + 1):
for j in range(1, n + 1):
if distance[i][j] == sys.maxsize:
print(0, end=' ')
else:
print(distance[i][j], end=' ')
print()
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int m = Integer.parseInt(br.readLine());
long[][] distance = new long[n + 1][n + 1]; //주의! long 사용
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < n + 1; j++) {
if (i != j) {
distance[i][j] = Integer.MAX_VALUE;
}
}
}
for (int i = 0; i < m; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
int cost = Integer.parseInt(st.nextToken());
if (distance[start][end] > cost) {
distance[start][end] = cost;
}
}
for (int k = 1; k < n + 1; k++) {
for (int s = 1; s < n + 1; s++) {
for (int e = 1; e < n + 1; e++) {
if (distance[s][e] > distance[s][k] + distance[k][e]) {
distance[s][e] = distance[s][k] + distance[k][e];
}
}
}
}
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < n + 1; j++) {
if (distance[i][j] == Integer.MAX_VALUE) {
System.out.print(0 + " ");
} else {
System.out.print(distance[i][j] + " ");
}
}
System.out.println();
}
}
}