Home Week8 - Bellman Ford
Post
Cancel

Week8 - Bellman Ford

๐Ÿ“ ๋ฌธ์ œ ๋ชฉ๋ก


๊ฐœ์ธ์ ์œผ๋กœ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•œ ๊ฒƒ์œผ๋กœ ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ์ง€์ ํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค๐Ÿ™


1. ํƒ€์ž„๋จธ์‹ 

๋‹จ์ผ ์ถœ๋ฐœ ์ตœ๋‹จ๊ฒฝ๋กœ ๋ฌธ์ œ์ด๊ณ , ์ œ๋ชฉ์—์„œ๋„ ์•Œ ์ˆ˜ ์žˆ๋“ฏ ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์Œ์ˆ˜์ผ ์ˆ˜๋„ ์žˆ๋Š” ๋ฌธ์ œ์ด๋‹ค. ๋˜ํ•œ ๋ฌธ์ œ์—์„œ ๊ฐ„์„ ์€ ๋ฐฉํ–ฅ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋ฒจ๋งŒํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ–ˆ๋‹ค. ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์Œ์ˆ˜ ์‚ฌ์ดํด์ด ์žˆ์œผ๋ฉด ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์—†๊ณ , ์Œ์ˆ˜ ์‚ฌ์ดํด์ด ์—†๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ๊ตฌํ•  ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ ๋Š” ํ•ด๋„ ๋ฒจ๋งŒํฌ๋“œ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ตณ์ด ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
๋™์ผํ•œ ๊ฐ’์„ ๋”ํ•ด์ฃผ์–ด ๊ฐ€์ค‘์น˜๋ฅผ ๋ชจ๋‘ ์–‘์ˆ˜๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ฐฉ๋ฒ•๋„ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์ง€๋‚˜์˜จ ๊ฐ„์„ ์˜ ์ˆ˜๋งŒํผ ๊ฐ’์ด ๋”ํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ž์นซ ํ‹€๋ฆฐ ๊ฐ’์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์–ด ๋”ฐ๋กœ ๋˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ฑฐ๋‚˜ ํ•ด์•ผ ํ•œ๋‹ค. (์˜ˆ๋ฅผ ๋“ค๋ฉด ๋” ๋งŽ์€ ๊ฐ„์„ ์„ ๊ฑฐ์น˜๋Š” ๋” ์งง์€ ๊ฒฝ๋กœ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ)
(์ฐธ๊ณ : https://www.acmicpc.net/board/view/19865)

๋ฒจ๋งŒํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์Œ์ˆ˜ ์‚ฌ์ดํด์„ ์ฐพ์•„๋‚ด๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. V-1๋ฒˆ์˜ ๊ฐ„์„  ์™„ํ™” ์ž‘์—… => ๋ชจ๋“  ์ •์ ์— ๋Œ€ํ•œ ์ตœ๋‹จ๊ฒฝ๋กœ ๊ตฌํ•˜๊ธฐ๊ฐ€ ๋๋‚œ๋‹ค.
  2. ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•œ๋ฒˆ ๋” ๊ฐ„์„  ์™„ํ™” ์ž‘์—… => ์—ฌ๊ธฐ์„œ ๊ฐ’์ด ๊ฐฑ์‹ ๋˜๋ฉด ์Œ์ˆ˜ ์‚ฌ์ดํด์ด ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.

๊ฐ„์„  ์™„ํ™”๋ฅผ 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)์ด๋‹ค.

๊ฐ„์„  ์™„ํ™” ์‹œ ์ฃผ์˜ํ–ˆ๋˜ ์ ์€ ์ด๋Ÿฐ ๊ฒƒ๋“ค์ด ์žˆ์—ˆ๋‹ค.

  1. ํ•œ๋ฒˆ์ด๋ผ๋„ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ณ„์‚ฐ๋œ ์  ์žˆ๋Š”(=์‹œ์ž‘์ ์—์„œ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋œ) ์ •์ ์— ํ•œํ•ด์„œ๋งŒ ์™„ํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•จ:
    ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ์‹œ์ž‘์ ์—์„œ ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ์–ด๋Š ์ •์  A,B๊ฐ€ ์žˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ ๋‘˜ ์‚ฌ์ด์— ์Œ์ˆ˜ ์‚ฌ์ดํด์ด ์žˆ๋‹ค๋ฉด ๋ฌดํ•œ๋Œ€๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋˜ ๊ฑฐ๋ฆฌ๊ฐ’์ด ๊ณ„์†ํ•ด์„œ ์ค„์–ด๋“ค๋ฉด์„œ ์ด์ƒํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  2. ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒํ˜•์ด 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. ์›œํ™€

์ด ๋ฌธ์ œ์˜ ํŠน์ง•์€ ์ด๋Ÿฌํ–ˆ๋‹ค.

  1. ๋ชฉํ‘œ๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ(X) -> ์Œ์ˆ˜ ์‚ฌ์ดํด์ด ์žˆ๋Š”์ง€๋ฅผ ์ฒดํฌ(O) ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  2. ์‹œ์ž‘์ ์ด ๋”ฐ๋กœ ์ •ํ•ด์ ธ์žˆ์ง€ ์•Š๋‹ค.
  3. โ€œ๋„๋กœ๋Š” ๋ฐฉํ–ฅ์ด ์—†์œผ๋ฉฐ ์›œํ™€์€ ๋ฐฉํ–ฅ์ด ์žˆ๋‹ค.โ€

์ผ๋‹จ ์ด ๋ฌธ์ œ์—์„œ๋Š” ์Œ์ˆ˜ ์‚ฌ์ดํด์ด ์žˆ๋Š”์ง€์—๋งŒ ๊ด€์‹ฌ์ด ์žˆ์œผ๋ฏ€๋กœ ์–ด๋–ค ์ ์—์„œ ๋‹ค๋ฅธ ์ ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋Š” ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ์• ์ดˆ์— ์‹œ์ž‘์ ๋„ ๋”ฐ๋กœ ์ •ํ•ด์ ธ์žˆ์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ๋‹ค์‹œ ์ž๊ธฐ ์œ„์น˜๋กœ ๋Œ์•„์™”์„ ๋•Œ ์‹œ๊ฐ„์ด ์ค„์–ด๋“œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”์ง€๋งŒ ์•Œ์•„๋ณด๋ฉด ๋œ๋‹ค(๋ชจ๋“  ์ •์ ์— ๋Œ€ํ•ด์„œ).
๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์„œ๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ฐ’์„ ๋ฌดํ•œ๋Œ€๊ฐ€ ์•„๋‹ˆ๋ผ 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";
	}
}
This post is licensed under CC BY 4.0 by the author.

5719 : ๊ฑฐ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ

[Unity Graphics Study] 5. Shader(2) - Outline, Rim light

Comments powered by Disqus.