๐ ๋ฌธ์ ๋ชฉ๋ก
- [๐ฅ4] 11657 - ํ์๋จธ์
- [๐ฅ3] 1865 - ์ํ
๊ฐ์ธ์ ์ผ๋ก ๊ณต๋ถํ ๋ด์ฉ์ ์์ฑํ ๊ฒ์ผ๋ก ํ๋ฆฐ ๋ถ๋ถ์ด ์์ ์ ์์ต๋๋ค
ํ๋ฆฐ ๋ถ๋ถ์ด ์๋ค๋ฉด ์ง์ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค๐
1. ํ์๋จธ์
๋จ์ผ ์ถ๋ฐ ์ต๋จ๊ฒฝ๋ก ๋ฌธ์ ์ด๊ณ , ์ ๋ชฉ์์๋ ์ ์ ์๋ฏ ๊ฐ์ ์ ๊ฐ์ค์น๊ฐ ์์์ผ ์๋ ์๋ ๋ฌธ์ ์ด๋ค. ๋ํ ๋ฌธ์ ์์ ๊ฐ์ ์ ๋ฐฉํฅ์ ๊ฐ๊ณ ์๋ค.
๋ฐ๋ผ์ ๋ฒจ๋งํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค. ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์์ ์ฌ์ดํด์ด ์์ผ๋ฉด ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ตฌํ ์ ์๊ณ , ์์ ์ฌ์ดํด์ด ์๋ ๊ทธ๋ํ์์ ๊ตฌํ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ๋ ํด๋ ๋ฒจ๋งํฌ๋๋ณด๋ค ์ฑ๋ฅ์ด ์ข์ง ์์ผ๋ฏ๋ก ๊ตณ์ด ์ฐ์ง ์๋๋ค.
๋์ผํ ๊ฐ์ ๋ํด์ฃผ์ด ๊ฐ์ค์น๋ฅผ ๋ชจ๋ ์์๋ก ๋ง๋ค์ด์ฃผ๋ ๋ฐฉ๋ฒ๋ ์๊ฐํด๋ณผ ์ ์์ง๋ง ๊ทธ๋ ๊ฒ ํ๋ฉด ์ง๋์จ ๊ฐ์ ์ ์๋งํผ ๊ฐ์ด ๋ํด์ง๊ธฐ ๋๋ฌธ์ ์์นซ ํ๋ฆฐ ๊ฐ์ด ๋์ฌ ์ ์์ด ๋ฐ๋ก ๋ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๊ฑฐ๋ ํด์ผ ํ๋ค. (์๋ฅผ ๋ค๋ฉด ๋ ๋ง์ ๊ฐ์ ์ ๊ฑฐ์น๋ ๋ ์งง์ ๊ฒฝ๋ก๊ฐ ์์ ๊ฒฝ์ฐ)
(์ฐธ๊ณ : https://www.acmicpc.net/board/view/19865)
๋ฒจ๋งํฌ๋ ์๊ณ ๋ฆฌ์ฆ์์ ์์ ์ฌ์ดํด์ ์ฐพ์๋ด๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
- V-1๋ฒ์ ๊ฐ์ ์ํ ์์ => ๋ชจ๋ ์ ์ ์ ๋ํ ์ต๋จ๊ฒฝ๋ก ๊ตฌํ๊ธฐ๊ฐ ๋๋๋ค.
- ๋ง์ง๋ง์ผ๋ก ํ๋ฒ ๋ ๊ฐ์ ์ํ ์์ => ์ฌ๊ธฐ์ ๊ฐ์ด ๊ฐฑ์ ๋๋ฉด ์์ ์ฌ์ดํด์ด ์๋ค๋ ๋ป์ด๋ค.
๊ฐ์ ์ํ๋ฅผ V-1๋ฒ ํด์ฃผ๋ ์ด์ ๋ ์ด๋ ๋ค.
์ผ๋จ ์ฐ๋ฆฌ๋ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๊ธฐ ์ํ ์ต์ ์ ๋ฐฉ๋ฌธ ์์๋ฅผ ์ ์ ์๋ค. ํ๋ฒ์ ๋ชจ๋ ์ ์ ์ ๋ํ ์ต๋จ๊ฒฝ๋ก๊ฐ ๊ตฌํด์ง์๋ ์์ง๋ง, ๋ฐฉ๋ฌธ ์์์ ๋ฐ๋ผ ์ฌ๋ฌ๋ฒ ๋ฐ๋ณตํด์ผ๋ง ์ต๋จ๊ฒฝ๋ก๊ฐ ๊ตฌํด์ง๋ ๊ฒฝ์ฐ๋ ์๋ค.
https://sodocumentation.net/algorithm/topic/4791/bellman-ford-algorithm#why-do-we-need-to-relax-all-the-edges-at-mostโv-1โtimes
(์ ๋งํฌ๋ ์ต์
์ ์์๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์๋ค.)
ํ์ง๋ง ์ด๋ ๊ฒ ์ต์
์ ์์๋ก ์งํํ๋๋ผ๋ ํ๋ฒ ์ํํ ๋๋ง๋ค ์ ์ ํ๋์ฉ์ ์ต์ข
์ต๋จ๊ฒฝ๋ก๊ฐ ๊ตฌํด์ง๋ค. ์ฆ ์ต์
์ ๋ฐฉ๋ฌธ ์์์์๋ V-1๋ฒ์ ๋ฐ๋ณตํ๋ฉด ๋ชจ๋ ์ ์ ์ ์ต๋จ๊ฒฝ๋ก๊ฐ ๊ตฌํด์ง๊ฒ ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ์๊ฐ๋ณต์ก๋๋ ๋ชจ๋ ๊ฐ์ ์ ์ํ(O(E))ํ๋ ์์ ์ V-1๋ฒ ๋ฐ๋ณตํ๋ฏ๋ก(O(V)) => O(VE)์ด๋ค.
๊ฐ์ ์ํ ์ ์ฃผ์ํ๋ ์ ์ ์ด๋ฐ ๊ฒ๋ค์ด ์์๋ค.
- ํ๋ฒ์ด๋ผ๋ ๊ฑฐ๋ฆฌ๊ฐ ๊ณ์ฐ๋ ์ ์๋(=์์์ ์์ ๋๋ฌ ๊ฐ๋ฅํ๋ค๊ณ ํ๋จ๋) ์ ์ ์ ํํด์๋ง ์ํ ์์
์ ์ํํจ:
๊ทธ๋ ์ง ์์ผ๋ฉด, ์์์ ์์ ๋๋ฌํ ์ ์๋ ์ด๋ ์ ์ A,B๊ฐ ์๋ค๊ณ ํ์ ๋ ๋ ์ฌ์ด์ ์์ ์ฌ์ดํด์ด ์๋ค๋ฉด ๋ฌดํ๋๋ก ์ ์ฅ๋์ด ์๋ ๊ฑฐ๋ฆฌ๊ฐ์ด ๊ณ์ํด์ ์ค์ด๋ค๋ฉด์ ์ด์ํ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. - ์ต์ข
๊ฒฐ๊ณผ๊ฐ์ ์ ์ฅํ๋ ์๋ฃํ์ด long long์ด์ด์ผ ํจ:
์ด ๋ฌธ์ ์์ ์ฃผ์ด์ง ๊ฐ์ค์น์ ๋ฐ๋ฅด๋ฉด, ๊ฐฑ์ ์ ๋ฐ๋ณตํ๋ค๊ฐ int์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ๊ฐ ์๊ธธ ๊ฐ๋ฅ์ฑ์ด ์๋ค. ๋ฐ๋ผ์ ์ธ๋ํ๋ก์ฐ๊ฐ ๋ฐ์ํ๋ฉด ์๋ชป๋ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๋ค.
์ฝ๋
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
#include<iostream>
#include<vector>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
const int INF = 99999999; // ๋ฌดํ
bool has_cycle = false; // ์์ ์ฌ์ดํด ์ฒดํฌ
int n, m;
long long dist[501]; // ์ต์ข
๊ฒฐ๊ณผ๊ฐ
vector<pair<int, int>> d[501]; // ๊ฐ์ ์ ๋ณด
cin >> n >> m;
for (int i = 0; i < m; i++) {
int a, b, c;
cin >> a >> b >> c;
d[a].push_back({ b, c });
}
fill_n(dist, n+1, INF);
dist[1] = 0;
for (int i = 0; i < n - 1; i++) {
for (int here = 1; here <= n; here++) {
if (dist[here] == INF) continue;
for (auto& p : d[here]) {
int there = p.first;
int t = p.second;
if (dist[here] + t < dist[there]) dist[there] = dist[here] + t;
}
}
}
// ์์ ์ฌ์ดํด์ด ์๋์ง ํ์ธ
for (int here = 1; here <= n; here++) {
if (dist[here] == INF) continue;
for (auto& p : d[here]) {
int there = p.first;
int t = p.second;
if (dist[here] + t < dist[there]) has_cycle = true;
}
}
if (has_cycle) cout << -1;
else {
for (int i = 2; i <= n; i++) {
cout << ((dist[i] == INF) ? -1 : dist[i]) << "\n";
}
}
}
2. ์ํ
์ด ๋ฌธ์ ์ ํน์ง์ ์ด๋ฌํ๋ค.
- ๋ชฉํ๋ ์ต๋จ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ(X) -> ์์ ์ฌ์ดํด์ด ์๋์ง๋ฅผ ์ฒดํฌ(O) ํ๋ ๊ฒ์ด๋ค.
- ์์์ ์ด ๋ฐ๋ก ์ ํด์ ธ์์ง ์๋ค.
- โ๋๋ก๋ ๋ฐฉํฅ์ด ์์ผ๋ฉฐ ์ํ์ ๋ฐฉํฅ์ด ์๋ค.โ
์ผ๋จ ์ด ๋ฌธ์ ์์๋ ์์ ์ฌ์ดํด์ด ์๋์ง์๋ง ๊ด์ฌ์ด ์์ผ๋ฏ๋ก ์ด๋ค ์ ์์ ๋ค๋ฅธ ์ ์ ๋๋ฌํ ์ ์๋์ง๋ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋๋ค. ์ ์ด์ ์์์ ๋ ๋ฐ๋ก ์ ํด์ ธ์์ง ์๊ณ ๊ทธ๋ฅ ๋ค์ ์๊ธฐ ์์น๋ก ๋์์์ ๋ ์๊ฐ์ด ์ค์ด๋๋ ๊ฒฝ์ฐ๊ฐ ์๋์ง๋ง ์์๋ณด๋ฉด ๋๋ค(๋ชจ๋ ์ ์ ์ ๋ํด์).
๋ฐ๋ผ์ ์ฌ๊ธฐ์๋ ์ต๋จ๊ฑฐ๋ฆฌ ๊ฐ์ ๋ฌดํ๋๊ฐ ์๋๋ผ 0์ผ๋ก ์ด๊ธฐํํด ์ฃผ์๊ณ , ๋ฐฉ๋ฌธํ ์ ์ ์ ํํด์๋ง ์ํ ์์
์ ์ํํ๊ฒ ํ๋ ์กฐ๊ฑด๋ฌธ๋ ์์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฌธ์ ์ ์ ํ์๋๋๋ก ๋๋ก๋ ๋ฌด๋ฐฉํฅ์์ ๊ณ ๋ คํ์ฌ ์
๋ ฅ๋ฐ์ ๋ ๋ฐ๋ ๋ฐฉํฅ ๊ฐ์ ์ ๋ณด๋ ๊ฐ์ด ์ ์ฅํด์ฃผ์๋ค.
์ฝ๋๋ฅผ ๋ณด๋ฉด ์ ๋ฌธ์ ์์๋ ์๊ณ ๋ฆฌ์ฆ์ด ์ต์ํ์ง ์์ ํท๊ฐ๋ฆฌ์ง ์๊ธฐ ์ํด n-1๋ฒ ์ํ๋ฅผ ์ํํ๊ณ ์์ ์ฌ์ดํด์ ํ์ธํ๋ ๊ณผ์ ์ ๋ฐ๋ก ๋นผ์ฃผ์์ง๋ง ์ฌ๊ธฐ์๋ ์ฝ๋๋ฅผ ์ค์ฌ n๋ฒ ์ํํ๊ณ ๋ง์ง๋ง์ ์์ ์ฌ์ดํด์ ํ์ธํ๋๋ก ํ๋ค.
์ฝ๋
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
#include<iostream>
#include<vector>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int tc;
cin >> tc;
for (int i = 0; i < tc; i++) {
bool has_cycle = false;
int n, m, w;
cin >> n >> m >> w;
long long dist[501];
vector<pair<int, int>> d[501];
for (int i = 1; i <= m + w; i++) {
int s, e, t;
cin >> s >> e >> t;
if (i <= m) {
d[s].push_back({ e,t });
d[e].push_back({ s,t });
}
else d[s].push_back({ e,-t });
}
fill_n(dist, n + 1, 0);
for (int i = 1; i <= n; i++) {
for (int here = 1; here <= n; here++) {
for (auto& p : d[here]) {
int there = p.first;
int d = p.second;
if (dist[here] + d < dist[there]) {
if (i == n) has_cycle = true;
else dist[there] = dist[here] + d;
}
}
}
}
cout << ((has_cycle) ? "YES" : "NO") << "\n";
}
}