๋ฌธ์
ํ์ด
ํ๋ก์ด๋-์์ ์ ๊ธฐ์ด ๋ฌธ์ ๋ค.
graph[i][k]
์ graph[k][j]
์ ๊ฐ์ ์ด ์กด์ฌํ๋ฉด, graph[i][j]
์ ๊ฐ์ ์ญ์ ์กด์ฌํ๋ค. => ํ๋ก์ด๋-์์
์ ๊ธฐ๋ณธ ์๊ณ ๋ฆฌ์ฆ!
๋ชจ๋ ๋ ธ๋๋ฅผ ์ถ๋ฐ์ ์ผ๋ก ์ผ๊ณ , ๋ชจ๋ ๋ ธ๋๋ฅผ ๋์ฐฉ ๋ ธ๋๋ก ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ฏ๋ก, 3์ค ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ค.
cf) ๋ค์ต์คํธ๋ผ/๋ฒจ๋งํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ํ ๋ ธ๋์์ ๋ชจ๋ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ค.
์๊ฐ ๋ณต์ก๋๋ $O(n^{3})$์ด๋ค. ๊ทธ๋ํ๊ฐ ์ถฉ๋ถํ ์์ ๊ฒฝ์ฐ ์ฌ์ฉํ์!
์ฝ๋
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
#include <iostream>
int graph[101][101];
int main()
{
// init & input
int n;
std::cin >> n;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
std::cin >> graph[i][j];
}
}
// floyd-warshall
for (int k = 0; k < n; k++)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (graph[i][k] && graph[k][j]) graph[i][j] = 1;
}
}
}
// output
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
std::cout << graph[i][j] << " ";
}
std::cout << "\n";
}
return 0;
}
Leave a comment