baekjoon 11404:플로이드
11404번 플로이드
접근
플로이드 워셜 알고리즘 쓰는 문제이다.
원래는 3차원으로 만드는 거지만 2차원으로 해도 문제없다.
코드에서 더 자세히 설명하겠다.
코드
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
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <vector>
#define INF 100000000
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n, m;
cin >> n;
cin >> m;
vector<vector<int>> d(n, vector<int>(n, INF));
for(int i = 0; i < n; i++){
d[i][i] = 0;
}
while(m--){
int a, b, w;
cin >> a >> b >> w;
if(d[a-1][b-1] > w){ //초기세팅: 중간에 아무런 node 없는경우
d[a-1][b-1] = w;
}
}
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]);
//중간에 0 node 갔다오는경우
//중간에 0~1 node 갔다오는 경우
//중간에 0~n-1 node 갔다오는 경우
//k=5일때의 loop는 0~5 node를 갔다오는 경우이고 d^5[i][j] = min(d^4[i][j], d^4[i][5]+d^4[5][j])이다.
//d^4[i][j]야 자명한데(아직 업데이트 안했으니까), d^4[i][5], d^4[5][j]인지는 사실 d^5[i][5] == d^4[i][5], d^5[5][j] == d^4[5][j]이므로
//먼저 업데이트 된 상태여도 아니여도 상관없다.
}
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(d[i][j] == INF) d[i][j] = 0;
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
cout << d[i][j] << ' ';
}
cout << '\n';
}
return 0;
}
배운 점
플로이드 워셜 알고리즘 직접구현 해봤다.
플로이드 워셜 알고리즘은 음의 간선은 있어도 된다.
하지만 음의 사이클은 있으면 안된다.
This post is licensed under CC BY 4.0 by the author.