Home Week6 - Floyd Warshall
Post
Cancel

Week6 - Floyd Warshall

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


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


1. ํ”Œ๋กœ์ด๋“œ

๋ฌธ์ œ ์ œ๋ชฉ๋ถ€ํ„ฐ ์•„์˜ˆ ํ”Œ๋กœ์ด๋“œ๋ผ๊ณ  ์ ํ˜€์žˆ๋Š”๋งŒํผ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ ์œ ํ˜•์˜ ๋ฌธ์ œ์ด๋‹ค.
๋ชจ๋“  ์ •์ ์˜ ์Œ(A,B)์— ๋Œ€ํ•ด A์—์„œ B๋กœ ๊ฐ€๋Š” ์ตœ์†Œ๋น„์šฉ์„ ๋ชจ๋‘ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ.
์‚ฌ์‹ค ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด๋ฒˆ์— ์ฒ˜์Œ ์ ‘ํ–ˆ๋Š”์ง€ ์•„๋‹ˆ๋ฉด ์˜ค๋ž˜๋˜์–ด ๊นŒ๋จน์€ ๊ฑด์ง€ ๊ธฐ์–ต์ด ์•ˆ ๋‚˜์„œ;; ์ด ๋ฌธ์ œ๋Š” ๊ณต๋ถ€ํ•˜๋Š” ๊ฒธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๋ช…์„ ๋ณด๋ฉด์„œ ๊ตฌํ˜„ํ–ˆ๋‹ค.
์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š”

1
2
๋ชจ๋“  ์ •์  i์— ๋Œ€ํ•˜์—ฌ => O(V)
i๋ฅผ ๊ฑฐ์น˜๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ(A->B)์— ๋Œ€ํ•ด ๋น„์šฉ์„ ๋น„๊ต => O(V^2)

์ด๋ฏ€๋กœ ์ด O(V^3)์ด ๋œ๋‹ค.

์ด ๋ฌธ์ œ์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ์„ ์ฃผ์˜ํ–ˆ๋‹ค.

  1. ์ž…๋ ฅ์—์„œ ์ฃผ์–ด์ง€๋Š” ๊ฐ’ ์ค‘ A->B๋กœ ๊ฐ€๋Š” ๋…ธ์„ ์ด ์—ฌ๋Ÿฌ๊ฐœ์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ๋„ ์ตœ์†Œ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ ํ•ด์ฃผ์–ด์•ผ ํ•จ
  2. ๋ฌดํ•œ(INF) ๊ฐ’์„ ์ถฉ๋ถ„ํžˆ ํฌ๊ฒŒ ํ•ด ์ฃผ์–ด์•ผ ํ•จ:
    ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ๋กœ์— ๋Œ€ํ•˜์—ฌ INF ๊ฐ’์„ ์ •ํ•ด์ค„ ๋•Œ ์ฒ˜์Œ์—๋Š” ๋‹จ์ˆœํžˆ ๋น„์šฉ์˜ ์ตœ๋Œ€๊ฐ’๋ณด๋‹ค 1 ํฐ 100,001๋กœ ์„ค์ •ํ•ด ์ฃผ์—ˆ๋Š”๋ฐ, ๋Œ์•„์„œ ๊ฐ€๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜๋ฉด ์ตœ์†Œํ•œ (๋น„์šฉ์˜ ์ตœ๋Œ€๊ฐ’*(๋„์‹œ์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜-1)+1) ์ด์ƒ์œผ๋กœ ์„ค์ •ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.
  3. ์ถœ๋ฐœ์ ๊ณผ ๋„์ฐฉ์ ์ด ๊ฐ™์„ ๊ฒฝ์šฐ 0์œผ๋กœ ์ดˆ๊ธฐํ™”:
    A->A ๊ฒฝ๋กœ๊ฐ€ ์—†๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ์ด ๊ฒฝ์šฐ์—๋Š” INF๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๋ฉด ์•ˆ๋œ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์ถœ๋ฐœ์ ๊ณผ ๋„์ฐฉ์ ์ด ๊ฐ™์€ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ๋”ฐ๋กœ ๋„˜๊ฒจ์ฃผ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— i๋ฅผ ๊ฑฐ์น˜๋Š” ๊ฒฝ๋กœ๋กœ ๊ฐฑ์‹ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฌผ๋ก  2, 3๋ฒˆ์€ ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ๋กœ๋‚˜ ์ถœ๋ฐœ์ =๋„์ฐฉ์  ์ธ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ํŒจ์Šคํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด ๊ตณ์ด ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋  ๋ถ€๋ถ„์ด๋‹ค.
๋‚˜๋Š” ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด 3์ค‘ for๋ฌธ์ด ๊ฐ„๊ฒฐํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•ด์„œ ๊ทธ๋ ‡์ง€๋งŒ, ๋งŒ์•ฝ for๋ฌธ์—์„œ ํŒจ์Šคํ•˜๋„๋ก ์กฐ๊ฑด๋ฌธ์„ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค๋ฉด
for๋ฌธ์„ ๋„๋Š” ์‹œ๊ฐ„์ด ์ค„์–ด๋“œ๋ฏ€๋กœ ์•ฝ๊ฐ„ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ด๊ณ ,
๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ๋กœ์™€ ์ถœ๋ฐœ์ =๋„์ฐฉ์ ์„ ๋ชจ๋‘ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด๋†“์•˜๋‹ค๋ฉด INF๋„ ํ•„์š” ์—†๊ณ  ์ดํ›„ 0์œผ๋กœ ๊ณ ์ณ ์ถœ๋ ฅํ•  ํ•„์š”๋„ ์—†๋‹ค.

์ฝ”๋“œ

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
#include<iostream>

using namespace std;
const int MAX = 9900000;

int min(int a, int b) {
	return (a < b) ? a : b;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int n, m;
	int cost[101][101];
	cin >> n >> m;

	fill_n(cost[0], 101 * 101, MAX + 1);
	for (int i = 1; i <= n; i++) {
		cost[i][i] = 0;
	}

	for (int i = 0; i < m; i++) {
		int from;
		int to;
		int c;
		cin >> from >> to >> c;
		cost[from][to] = min(cost[from][to], c);
	}

	for (int i = 1; i <= n; i++) {
		for (int from = 1; from <= n; from++) {
			for (int to = 1; to <= n; to++) {
				if (cost[from][to] > cost[from][i] + cost[i][to])
					cost[from][to] = cost[from][i] + cost[i][to];
			}
		}
	}

	for (int from = 1; from <= n; from++) {
		for (int to = 1; to <= n; to++) {
			// ๊ฐˆ ์ˆ˜ ์—†์„ ๊ฒฝ์šฐ 0์œผ๋กœ ํ‘œ์‹œ
			cout << ((cost[from][to] > MAX) ? 0 : cost[from][to]) << " ";
		}
		cout << "\n";
	}
}


2. ํšŒ์žฅ๋ฝ‘๊ธฐ

๋ฌธ์ œ ์„ค๋ช… ๋•Œ๋ฌธ์— ์ข€ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ์ด์ „ ๋ฌธ์ œ์™€ ๊ฒฐ๊ตญ ๋˜‘๊ฐ™๋‹ค.
(์†”์งํžˆ ๋ชจ๋ฅด๊ณ  ๋ดค์œผ๋ฉด ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋– ์˜ฌ๋ฆฌ์ง€ ๋ชปํ–ˆ์„ ๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ•˜๋‹ค=_=;;)
์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ํšŒ์žฅํ›„๋ณด๋ž€ ๋‹ค๋ฅธ ๋ชจ๋“  ํšŒ์›๋“ค๊ณผ ์ œ์ผ ์‚ฌ์ด๊ฐ€ ๊ฐ€๊นŒ์šด ์‚ฌ๋žŒ, ์ฆ‰ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ๊ณผ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ •์ ์ด๋ผ๋Š” ๋œป์ด๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ค ๋ชจ์ž„์˜ ํšŒ์žฅ ํ›„๋ณด์˜ ๊ฐ€์žฅ ๋จผ ์นœ๊ตฌ์‚ฌ์ด๊ฐ€ โ€˜์นœ๊ตฌ์˜ ์นœ๊ตฌโ€™ ๋ผ๋ฉด ํšŒ์žฅ ํ›„๋ณด์˜ ์ ์ˆ˜๋Š” 2์ด๋‹ค.

์ด์ „ ๋ฌธ์ œ์™€ ๊ฐ™์ด ๋ชจ๋“  ํšŒ์›๋“ค๊ณผ์˜ ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด intํ˜• 2์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ–ˆ๊ณ ,
๋ชจ๋“  ํšŒ์›์— ๋Œ€ํ•˜์—ฌ ๊ฐ€์žฅ ๋จผ ์‚ฌ์ด์˜ ๊ฐ’์„ ๊ตฌํ•ด์„œ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํšŒ์›์˜ ์ธ๋ฑ์Šค์™€ ๊ฐ€์žฅ ๋จผ ์‚ฌ์ด ๊ฐ’์„ ์ €์žฅํ•˜๋Š” pairํ˜• ๋ฐฐ์—ด๋„ ์‚ฌ์šฉํ–ˆ๋‹ค.
(pairํ˜• ๋ฐฐ์—ด์˜ ์ •๋ ฌ์„ ์œ„ํ•ด second ๊ฐ’์œผ๋กœ ๋น„๊ตํ•˜๋Š” compare ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๊ณ  sort()์—์„œ ์‚ฌ์šฉํ•˜์˜€๋‹ค.)
๊ทธ๋ฆฌ๊ณ  ์ดํ›„์— ํšŒ์žฅ ํ›„๋ณด์˜ ์ˆ˜์™€ ํ›„๋ณด๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด intํ˜• queue๋„ ์‚ฌ์šฉํ–ˆ๋‹ค.

์ฝ”๋“œ

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
#include<iostream>
#include<algorithm>
#include<queue>

using namespace std;

bool compare(pair<int, int> a, pair<int, int> b) {
	if (a.second == b.second) return a.first < b.first;
	else return a.second < b.second;
}

int max(int a, int b) {
	return (a > b) ? a : b;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int n;
	int score[51][51];
	pair<int, int> max_score[51];
	queue<int> candidate;
	cin >> n;

	fill_n(score[0], 51 * 51, n - 1);
	for (int i = 1; i <= n; i++) {
		score[i][i] = 0;
		max_score[i] = { i,0 };
	}

	while (true) {
		int a, b;
		cin >> a >> b;
		if (a == -1) break;
		score[a][b] = 1;
		score[b][a] = 1;
	}

	// from~to์˜ ์ตœ๋‹จ๊ฒฝ๋กœ ๊ฐ๊ฐ ๊ตฌํ•˜๊ธฐ
	for (int i = 1; i <= n; i++) {
		for (int from = 1; from <= n; from++) {
			for (int to = 1; to <= n; to++) {
				if (score[from][to] > score[from][i] + score[i][to])
					score[from][to] = score[from][i] + score[i][to];
			}
		}
	}

	// ๊ฐ ์ •์ ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ๊ณผ์˜ ๊ฑฐ๋ฆฌ ์ค‘ ๊ฐ€์žฅ ๋จผ ๊ฐ’ ๊ตฌํ•˜๊ธฐ
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			max_score[i].second = max(max_score[i].second, score[i][j]);
		}
	}

	// ์ ์ˆ˜ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ
	sort(max_score + 1, max_score + n + 1, compare);

	// ํšŒ์žฅ ํ›„๋ณด๋งŒ ํ์— ๋„ฃ์Œ
	candidate.push(max_score[1].first);
	for (int i = 2; i <= n; i++) {
		if (max_score[1].second == max_score[i].second) candidate.push(max_score[i].first);
		else break;
	}

	cout << max_score[1].second << " " << candidate.size() << "\n";
	while (!candidate.empty()) {
		cout << candidate.front() << " ";
		candidate.pop();
	}
}


3. n๋‹จ ๋…ผ๋ฒ•

Aโ†’B์ด๊ณ  Bโ†’C์ด๋ฉด Aโ†’C์ด๋‹ค.

์œ„์˜ ์‚ผ๋‹จ๋…ผ๋ฒ•์„ ์‘์šฉํ•ด ์ „์ œ์™€ ๊ฒฐ๋ก ์ด ์ฃผ์–ด์ง€๋ฉด ๊ฒฐ๋ก ์ด ์ฐธ์ธ์ง€ ๊ฑฐ์ง“์ธ์ง€๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
๊ฐ„์„  ๋น„์šฉ์ด ๋”ฐ๋กœ ์—†์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ๋Š” boolํ˜• 2์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ด ์ผ์น˜ ๊ด€๊ณ„(true/false)๋งŒ์„ ์ €์žฅํ•˜๋„๋ก ํ–ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ด์ „ ๋ฌธ์ œ์™€ ๋‹ค๋ฅผ ๊ฒƒ ์—†๊ณ  ๋‹จ์ˆœํ•˜์ง€๋งŒ ๋ฐฐ์—ด์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ž…๋ ฅ๋ฐ›์€ ๋ฌธ์ž๋ฅผ int๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.
์ด๋•Œ ๋‚˜๋Š” ์ „์ œ ๋ฌธ์žฅ์„ getline()์œผ๋กœ ํ•œ๋ฒˆ์— ๋ฐ›์•„์„œ ์ฒ˜์Œ๊ณผ ๋์„ ๋ฝ‘๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— n, m์„ ์ž…๋ ฅ๋ฐ›์€ ํ›„์— ๊ฐœํ–‰๋ฌธ์ž๋ฅผ ์ง€์›Œ์ฃผ๊ธฐ ์œ„ํ•ด(flushing) cin.ignore()๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ
์Šคํ„ฐ๋””์›๋ถ„์—๊ฒŒ ๋ฐ›์€ ํ”ผ๋“œ๋ฐฑ์— ์˜ํ•˜๋ฉด ๊ทธ๋ƒฅ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ค‘๊ฐ„์˜ โ€œisโ€๋ฅผ string์œผ๋กœ ๋ฐ›์•„๋ฒ„๋ ค๋„ ๋œ๋‹ค.

์ฝ”๋“œ

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<string>

using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int n, m;
	bool equal[26][26];
	char result[10];
	cin >> n;
	cin.ignore(32767, '\n');

	fill_n(equal[0], 26 * 26, false);

	// ์ „์ œ ์ž…๋ ฅ๋ฐ›๊ธฐ
	for (int i = 0; i < n; i++) {
		string premise;
		getline(cin, premise);
		int first = premise.front() - 'a';
		int second = premise.back() - 'a';
		equal[first][second] = true;
		equal[first][first] = true;
		equal[second][second] = true;
	}

	// n๋‹จ ๋…ผ๋ฒ•
	for (int i = 0; i < 26; i++) {
		for (int first = 0; first < 26; first++) {
			for (int second = 0; second < 26; second++) {
				if (equal[first][i] && equal[i][second]) {
					equal[first][second] = true;
				}
			}
		}
	}

	cin >> m;
	cin.ignore(32767, '\n');

	for (int i = 0; i < m; i++) {
		string premise;
		getline(cin, premise);
		int first = premise.front() - 'a';
		int second = premise.back() - 'a';
		result[i] = (equal[first][second]) ? 'T' : 'F';
	}

	for (int i = 0; i < m; i++) {
		cout << result[i] << "\n";
	}
}
This post is licensed under CC BY 4.0 by the author.

Week5 - DFS

[Unity Graphics Study] 2. Post Processing

Comments powered by Disqus.