๐ ๋ฌธ์ ๋ชฉ๋ก
- [๐ฅ5] 1753 - ์ต๋จ๊ฒฝ๋ก
- [๐ฅ4] 10282 - ํดํน
- [๐ฅ4] 4485 - ๋ น์ ์ท ์ ์ ์ ๊ฐ ์ ค๋ค์ง?
๊ฐ์ธ์ ์ผ๋ก ๊ณต๋ถํ ๋ด์ฉ์ ์์ฑํ ๊ฒ์ผ๋ก ํ๋ฆฐ ๋ถ๋ถ์ด ์์ ์ ์์ต๋๋ค
ํ๋ฆฐ ๋ถ๋ถ์ด ์๋ค๋ฉด ์ง์ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค๐
์์ํ๊ธฐ ์ ์: ์ต๋จ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
์ด์ค๊ฐํ ํ์ด๋ฐ์ ์๊ธฐ๋ฅผ ๊บผ๋ธ ๊ฒ ๊ฐ์ง๋งโฆ โ์ต๋จ๊ฒฝ๋กโ๋ผ๋ ์ด๋ฆ์ ๋ฌธ์ ๊ฐ ๋์จ๊น์ ์ฌ๋ฌ๊ฐ์ง ์ต๋จ๊ฒฝ๋ก ๋ฌธ์ ์ ๋ํด ์ ๋ฆฌํด๋ด์ผ๊ฒ ๋ค. ํน์๋ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ๋ ์ ๋ฆฌํ ๊ฒธ.
์ผ๋จ ๋ชจ๋ ์ต๋จ๊ฒฝ๋ก ๋ฌธ์ ์์ ๊ตฌํ๊ณ ์ ํ๋ ๋ชจ๋ ๊ฐ์ ๊ฒฐ๊ตญ ์ ์ A->B๊น์ง์ ๊ฒฝ๋ก์ด๋ค.
- ๋จ์ผ ์(single-pair) ์ต๋จ๊ฒฝ๋ก: ํ ์ ์ A์์ ๋ค๋ฅธ ํ ์ ์ B๊น์ง์ ์ต๋จ๊ฒฝ๋ก
์ด๋ฅผ ๊ธฐ๋ณธ ๋ชฉํ๋ก ํ์ฌ ์ถ๋ฐ/๋์ฐฉ์ ์ ์ ๊ฐ์ง์์ ๋ฐ๋ผ ์๋์ ๊ฐ์ ์ ํ๋ค๋ก ๋ถ๋ฅ๋๋ค.
- ๋จ์ผ ์ถ๋ฐ(single-source) ์ต๋จ๊ฒฝ๋ก: ํ ์ ์ A์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ๊ฒฝ๋ก.
- ๋จ์ผ ๋์ฐฉ(single-destination) ์ต๋จ๊ฒฝ๋ก: ๋ชจ๋ ์ ์ ์์ ํ ์ ์ A๊น์ง์ ์ต๋จ๊ฒฝ๋ก. ๊ฐ์ ์ ๋ฐฉํฅ์ ๋ฐ๋๋ก ํ๋ฉด ๋จ์ผ ์ถ๋ฐ ์ต๋จ๊ฒฝ๋ก ๋ฌธ์ ์ ๊ฐ๋ค.
- ์ ์ฒด ์(all-pair) ์ต๋จ๊ฒฝ๋ก: ๋ชจ๋ ์ ์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก.
๊ทธ๋ฆฌ๊ณ ์ด๋ฐ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํ ์ฃผ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ด ์๋ค.
(์ด๋ ๊ฐ์ ์ ๋ฐฉํฅ์ด๋ ๊ฐ์ค์น๊ฐ ์๋์ง, ๊ฐ์ค์น์ ์์๊ฐ ํฌํจ๋๋์ง, ๊ฐ์ ์ ๊ฐ์๊ฐ ๋ง์์ง ์ ์์ง ๋ฑ ๊ทธ๋ํ์ ๊ฐ์ ์ ํน์ฑ์ ๋ฐ๋ผ์๋ ์ฌ์ฉ ์๊ณ ๋ฆฌ์ฆ๊ณผ ์๋ฃ๊ตฌ์กฐ๊ฐ ๋ค๋ฅด๋ค.)
- BFS: ๊ฐ์ค์น๊ฐ ๊ฐ๊ฑฐ๋ ์๋ ๊ทธ๋ํ์์ ์ต๋จ๊ฒฝ๋ก ๊ตฌํ๊ธฐ
- ๋ค์ต์คํธ๋ผ: (์์ ๊ฐ์ด ์๋)๊ฐ์ค์น๋ฅผ ๊ฐ๋ ๋จ์ผ ์ถ๋ฐ ์ต๋จ๊ฒฝ๋ก ๊ตฌํ๊ธฐ
- ๋ฒจ๋ง ํฌ๋: ๋ฐฉํฅ,๊ฐ์ค์น๋ฅผ ๊ฐ๋ ๋จ์ผ ์ถ๋ฐ ์ต๋จ๊ฒฝ๋ก ๊ตฌํ๊ธฐ(์์ ์ฌ์ดํด์ ์ฃผ์)
- A*: ๋จ์ผ ์ ์ต๋จ๊ฒฝ๋ก ๊ตฌํ๊ธฐ(ํ์ ์๋๋ฅผ ๋์ด๊ธฐ ์ํด ํด๋ฆฌ์คํฑ ์ฌ์ฉ)
- ํ๋ก์ด๋ ์์ : ์ ์ฒด ์ ์ต๋จ๊ฒฝ๋ก ๊ตฌํ๊ธฐ(๋จ ์์ ์ฌ์ดํด์ด ์์ด์ผ ํจ)
1. ์ต๋จ๊ฒฝ๋ก
์ด๋ฒ ์ฃผ์ฐจ๋ ์ด์ฉ๋ค ํฌ์คํ ์ ๊ณ์ํด์ ๋ฏธ๋ฃฌ ํ์ ๋ฌธ์ ํ๋์ ๊ธฐ์ต์ด ๊ฑฐ์ ์ฌ๋ผ์ ธ์ ์๋ฌด๋๋ ํ๋ ๋น์์ ์๊ฐ์ด๋ ํค๋งธ๋ ์ ์ ๋ค ์ ๊ธฐ๋ ์ด๋ ค์ธ ๊ฒ ๊ฐ๋คใ ใ
์ด ๋ฌธ์ ๋ ์์ฐ์ ๊ฐ์ค์น๊ฐ ์๋ ๊ฐ์ ์ ๊ฐ๋ ๊ทธ๋ํ์์ ๋จ์ผ ์ถ๋ฐ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋, ์์ฃผ ๋ํ์ ์ธ ๋ค์ต์คํธ๋ผ ๋ฌธ์ ์ด๋ค.
๋จผ์ ์๊ฐํด์ผ ํ ๊ฒ์ ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์์ ์ฐ๊ฒฐ๋์ง ์์๊ฑฐ๋ ์์ง ํ์ธ๋์ง ์์ ๋ ์ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ์ด๋ค ๊ฐ์ผ๋ก ํํํ๋๋ ๊ฒ์ธ๋ฐ, INF(๋ฌดํ๋)
๋ก ์ง์ ํด๋์ผ๋ฉด ์๊ณ ๋ฆฌ์ฆ์ ์ํด ๋ ์งง์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฐ๊ฒฌํ์ ๋ ๊ฐฑ์ ๋๋๋ก ํ ์ ์๋ค.
์๋ฌดํผ ๊ทธ๋ฌ๊ณ ๋์ ๋ชจ๋ ์ ์ ์ ๋ํ์ฌ โ์์์ K์์๋ถํฐ ์ ์ ๊น์ง์ ๊ฑฐ๋ฆฌ(์ดํ dist)โ๋ฅผ ๊ฐฑ์ ํด๋๊ฐ๋ค. ๋งคํ ๋ฏธ๋ฐฉ๋ฌธ ์ ์ ์ค K์ ๊ฐ์ฅ ๊ฐ๊น์ด๊ณณ ์ฆ dist๊ฐ ์ต์์ธ ์ ์ ์ ์ฐพ์ ๊ทธ์ ์ธ์ ํ ์ ์ ๋ค์ dist๋ฅผ ๊ฐฑ์ ํ๋ ๋ฐฉ์์ผ๋ก ์งํํ๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ๋ณต์ก๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
1
2
3
โ ๋ชจ๋ ๊ฐ์ ๋ค์ ํ๋ฒ์ฉ ๊ฒ์ฌ => O(E)
โก ๋ฏธ๋ฐฉ๋ฌธ ์ ์ ์ค dist๊ฐ ์ต์์ธ ์ ์ ์ฐพ๊ธฐ => O(ElogE)
๋ฐ๋ผ์ O(E + ElogE) = O(ElogE) (*๋๊ฐ์ ๊ฒฝ์ฐ E<V^2์ด๋ฏ๋ก O(ElogV)๋ผ๊ณ ๋ณด๋๋ฏํ๋ค.)
์ฌ๊ธฐ์ โก๋ ์ธ์ ๋ฆฌ์คํธ์ ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ์ ๋์ ์๊ฐ๋ณต์ก๋์ด๋ค.
์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋งค๋ฒ ๋ชจ๋ ์ ์ ์ dist๋ฅผ ๋น๊ตํ๋ ์์ผ๋ก ํ์ํ ์๋ ์์ง๋ง (O(V^2)), ์ ์ ์ ์๊ฐ ์ ๊ฑฐ๋ ๊ฐ์ ์ด ๋งค์ฐ ๋ง์ ๊ฒฝ์ฐ๊ฐ ์๋ ์ด์ ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋น ๋ฅด๋ค.
์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํด ์ ์ i์ ๋ํด (dist[i], i)๋ฅผ ์ ์ฅํ์ฌ dist๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋๋๋ก ๊ตฌํํ๋๋ฐ, ์ด๋ ์ฐ์ ์์ ํ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด๋ฆผ์ฐจ์์ด๋ฏ๋ก ํ์ ๋ฃ์ ๋ dist[i]์ ๋ง์ด๋์ค๋ฅผ ๊ณฑํด์ฃผ๊ฑฐ๋ ๋ณ์ ์ ์ธ ์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋๋๋ก ์จ์ฃผ์ด์ผ ํ๋ค. (์๋ ์ฝ๋ ์ฐธ๊ณ )
ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋ ๊ธฐ์ค์ โ๊ฑฐ๋ฆฌ๊ฐ ๊ฐฑ์ ๋์์ ๋โ ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์ข ํท๊ฐ๋ฆฐ ๋ถ๋ถ์ด ์์๋ค. ๋ฐ๋ก โ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํด์ผ ํ๋๊ฐ?โ์ ๋ํ ๋ฌธ์ ์๋๋ฐ, ์ฝ๋์์๋ ๋ณด์ด๋ฏ์ด ์ฌ์ค ๋๋ ๊ตณ์ด ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ์ง ์์๋ ๋๋ค๊ณ ์๊ฐํด์ ๋ฐ๋ก ๋ญ๊ฐ๋ฅผ ํด์ฃผ์ง ์์์๋ค.
์๋ํ๋ฉด ํ์ ๊ฐ์ ์ ์ ์ด ์ฌ๋ฌ๋ฒ ๋ค์ด๊ฐ๋๋ผ๋ ์ต์ด pop๋์์ ๋ ์ด๋ฏธ ์ธ์ ์ ์ ์ ๋ํ ์ต์ข
dist๋ฅผ ๊ตฌํด๋ฒ๋ ธ๊ธฐ ๋๋ฌธ์ ์ดํ ๋ค์ ๋ฐฉ๋ฌธํ๋๋ผ๋ ์ธ์ ์ ์ ์ dist๋ฅผ ๊ฐฑ์ ํ๊ณ ํ์ ๋ฃ๋ ์ผ์ ์ด์ฐจํผ ์์ ๊ฒ์ด๋ฏ๋ก ๊ฒฐ๊ณผ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค๊ณ ํ๋จํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฌผ๋ก ์๋ ์ฝ๋๋ก๋ ํต๊ณผํ๊ธด ํ๋ค. ๊ทธ๋ฌ๋ ๊ฒฐ๊ณผ๋ ๊ฐ๋๋ผ๋ ์ด์จ๋ pop๋ ๋๋ง๋ค ๊ทธ ์ ์ ์ ๋ํ ๋ชจ๋ ์ธ์ ์ ์ ์ ๊ฒ์ฌํ๊ธฐ๋ ํ ๊ฒ์ด๋ ๋ฌด์๋ฏธํ ์์
์ผ๋ก ์คํ์๊ฐ์ ์ํฅ์ ์ฃผ๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ์ธ์ ์ ์ ๊ฒ์ฌ ์ ๊ฑด๋๋ฐ๊ธฐ ์ํ ์กฐ๊ฑด๋ฌธ์ ์ถ๊ฐํด์ฃผ๋๊ฒ ์ข์ ๊ฒ์ด๋ค. ๋ญ bool ๋ฐฐ์ด์ ์ถ๊ฐํด์ ์ฒดํฌ๋ฅผ ํ๋ ์ง, ์๋ ์ฝ๋ ์ฃผ์์ฒ๋ผ dist ๊ฐ์ ๋น๊ตํ๋ ์งโฆ
(์ฐธ๊ณ ๋ธ๋ก๊ทธ ๊ธ)
์ฝ๋
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
52
53
54
55
56
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int INF = 99999999;
int dist[20001];
vector<pair<int, int>> adj[20001]; // (์ธ์ )์ ์ ๋ฒํธ, ๊ฐ์ค์น
priority_queue< pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>> > pq; // dist[์ ์ ], ์ ์ ๋ฒํธ
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int v, e, k;
cin >> v >> e >> k;
fill_n(&dist[1], v, INF);
for (int i = 0; i < e; i++) {
int f, t, d;
cin >> f >> t >> d;
adj[f].push_back({ t,d });
}
// ์์๋
ธ๋
dist[k] = 0;
pq.push({ 0, k });
while (!pq.empty()) {
int cur = pq.top().second;
int cur_dist = pq.top().first;
pq.pop();
// * ์ด๋ dist[cur]<cur_dist๋ผ๋ฉด continue ํด์ฃผ๊ธฐ
for (int i = 0; i < adj[cur].size(); i++) {
int next = adj[cur][i].first;
int next_adj = adj[cur][i].second;
if (cur_dist + next_adj < dist[next]) {
dist[next] = cur_dist + next_adj;
pq.push({ dist[next], next });
}
}
}
for (int i = 1; i <= v; i++) {
if (dist[i] == INF) cout << "INF";
else cout << dist[i];
cout << "\n";
}
}
2. ํดํน
์ปดํจํฐ์ ์์ ์ปดํจํฐ๋ค๋ผ๋ฆฌ์ ์์กด์ฑ ์ ๋ณด, ๊ทธ๋ฆฌ๊ณ ๋งจ ์ฒ์ ํดํน๋นํ ์ปดํจํฐ์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ฉด ์ด ๊ฐ์ผ๋ ์ปดํจํฐ ์์ ๋ง์ง๋ง ์ปดํจํฐ๊ฐ ๊ฐ์ผ๋๊ธฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ถ๋ ฅํ๋ ๋ฌธ์ ์ด๋ค.
์ ๋ฌธ์ ์ ๋น์ทํ๋ฐ ์๊ธด๊ฑด ์ฌ๊ธฐ์๋ ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํด์คฌ์ผ๋ฉด์ ๋ ์กฐ๊ฑด๋ฌธ์ ์ ๋ฃ์ด์คฌ๋ค๋๊ฑฐ๋ค=_=;; ๊ทธ๋ผ ์์ด๊ฑธ๊นโฆ์นด์ดํธ๋๋ฌธ์ ๋ฃ์๊ฑด์งโฆ๊ทผ๋ฐ ์ด์ฐจํผ ๋ง์ง๋ง์ INF ์๋๋ฉด ์ฌ๋ฆฌ๋ฉด ๋๋๋ฐ ๊ตณ์ด?ใ
ใ
์ํผโฆ๋ง์ง๋ง ์ปดํจํฐ๊ฐ ๊ฐ์ผ๋๊ธฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๊ฐ์ผ๋ ์ปดํจํฐ ์ค ๊ฐ์ฅ ๋จผ ๊ฒ์ ๊ฐ์ผ์๊ฐ์ผ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋งค ํ
์คํธ์ผ์ด์ค๋ง๋ค ๋ฐฐ์ด ๊ฐ์ ์ด๊ธฐํํด์ฃผ๋ ๊ฒ๋ ์์ง ์์๋ค.
์ฝ๋
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
// ๋ฐฉํฅ, ๊ฐ์ค์น ์์
const int INF = 99999999;
bool is_infected[10001];
int time[10001];
vector<pair<int, int>> adj[10001]; // ๊ฐ์ค์น(a->b ๊ฐ์ผ์๊ฐ), (์ธ์ )์ ์ ๋ฒํธ
priority_queue< pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>> > pq; // time[์ ์ ], ์ ์ ๋ฒํธ
void dijkstra() {
int cnt = 0;
int end_time = 0;
int n, d, c;
cin >> n >> d >> c;
fill_n(&is_infected[1], n, false);
fill_n(&time[1], n, INF);
for (int i = 1; i <= n; i++) {
adj[i].clear();
}
for (int i = 0; i < d; i++) {
int a, b, s;
cin >> a >> b >> s;
adj[b].push_back({ s,a });
}
// ์์์ ์
time[c] = 0;
pq.push({ time[c],c });
while (!pq.empty()) {
int cur = pq.top().second;
int cur_t = pq.top().first;
pq.pop();
// * ๊ฐ์ผ๋์์ผ๋ฉด continue
is_infected[cur] = true;
for (int i = 0; i < adj[cur].size(); i++) {
int next = adj[cur][i].second;
int next_t = adj[cur][i].first;
if (cur_t + next_t < time[next]) {
time[next] = cur_t + next_t;
pq.push({ time[next],next });
}
}
}
for (int i = 1; i <= n; i++) {
if (is_infected[i]) cnt++;
if (time[i] < INF && time[i] > end_time) {
end_time = time[i];
}
}
cout << cnt << " " << end_time << "\n";
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int num;
cin >> num;
for (int i = 0; i < num; i++) {
dijkstra();
}
}
3. ๋ น์ ์ท ์ ์ ์ ๊ฐ ์ ค๋ค์ง?๐
๊ฐ ์นธ์ ๋ฐฉ๋ฌธํ์ ๋ ์๋ ๊ธ์ก์ด ์ ํ NรN ํฌ๊ธฐ ๋งต์ด ์ฃผ์ด์ง๋ฉด, ์ผ์ชฝ ์ ๋์์ ์ค๋ฅธ์ชฝ ์๋ ๋์ผ๋ก ๊ฐ ๋๊น์ง ์ต์ํ ์ผ๋ง๋ฅผ ์๊ฒ ๋๋์ง ๊ตฌํ๋ ๋ฌธ์ ๋ค.
์ด ๋ฌธ์ ๋ ์ ๋ ๋ฌธ์ ๋ค๊ณผ ๋ฌ๋ฆฌ ๊ฐ ์นธ์ ๊ฐ์ด ์ฃผ์ด์ ธ์๊ณ ์ํ์ข์ฐ๋ฅผ ์ดํด๋ณด๋ ํ์์ ๋ฌธ์ ์ด๋ค. ๊ทธ๋์ ์ฐ์ ์ํ์ข์ฐ๋ฅผ ์ฐจ๋ก๋ก ๋ค๋ฆฌ๊ธฐ ์ํด x,y ์ด๋์ขํ๋ฅผ ๋ด์ dir ๋ฐฐ์ด์ ํ๋ ๋ง๋ค์ด์ฃผ๊ณ , ์ดํ ์กฐ๊ฑด๋ฌธ์์ ์ํ์ข์ฐ๋ฅผ ๋ค๋ ์ ๋ ๊ทธ ์นธ์ด ๋งต ๋ด์ ์๋ ์นธ์ธ์ง๋ ๊ฒ์ฌํด์คฌ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ์นธ์ ์ ์ฅ๋์ด ์๋ ๊ฐ์ ๊ฐ์ค์น๋ผ๊ณ ์๊ฐํด์, ์์์ ์์ ์ด๋ค ์นธ๊น์ง ๊ฐ๋ ๋ฐ ์๋ ์ต์ ๊ธ์ก์ result๋ผ๊ณ ํ์ ๋
๋ค์ ์นธ์ result๋ณด๋ค ์ง๊ธ ๋ฐ๊ณ ์๋ ์นธ์ ํตํด ๋ค์ ์นธ์ผ๋ก ๊ฐ์๋์ ๊ธ์ก์ด ๋ ์ ๋ค๋ฉด ๊ทธ ๊ฐ์ ๊ฐฑ์ ํจ๊ณผ ๋์์ ๋ค์ ์นธ์ ์ขํ๋ฅผ ํ์ ๋ฃ๋๋ก ํ๋ค.
์ด๋ ๊ฐ์ ๋น๊ตํ์ฌ ํ๋ฒ ๋ฐฉ๋ฌธํ๋ค๋ฉด ๋ ์ด์ ๋ฐฉ๋ฌธํ์ง ์๋๋ก ์กฐ๊ฑด๋ฌธ์ ๋ฃ์ด์ฃผ์๋ค.
๊ทธ๋ฌ๊ณ ๋์ (n,n)์ขํ์ result๋ฅผ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค. ํํ์ด๋ ์ถ๋ ฅํด์ผ ํ ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅผ ๋ฟ ๊ฒฐ๊ตญ ์ต์๋น์ฉ์ ๊ตฌํ๋ ๊ฑด ๋๊ฐ๋ค.
์ฝ๋
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
52
53
54
#include<iostream>
#include<queue>
using namespace std;
const int INF = 99999999;
int main() {
int num = 1;
int lost[126][126];
int dir[4][2] = { {-1,0},{0,-1},{0,1},{1,0} };
priority_queue<pair<int, pair<int, int>>> pq; // x, y
while (true) {
int n;
int result[126][126];
cin >> n;
if (n == 0) break;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> lost[i][j];
}
}
for (int i = 1; i <= n; i++) {
fill_n(&result[i][1], n, INF);
}
result[1][1] = lost[1][1];
pq.push({ -lost[1][1], { 1,1 } });
while (!pq.empty()) {
int cur_res = -pq.top().first;
int cur_x = pq.top().second.first;
int cur_y = pq.top().second.second;
pq.pop();
if (result[cur_x][cur_y] < cur_res) continue;
for (int i = 0; i < 4; i++) {
int next_x = cur_x + dir[i][0];
int next_y = cur_y + dir[i][1];
if (next_x > 0 && next_x <= n && next_y > 0 && next_y <= n &&
cur_res + lost[next_x][next_y] < result[next_x][next_y]) {
result[next_x][next_y] = result[cur_x][cur_y] + lost[next_x][next_y];
pq.push({ -result[next_x][next_y], { next_x,next_y } });
}
}
}
cout << "Problem " << num++ << ": " << result[n][n] << "\n";
}
}