๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

SW/Algorithm for ์ฝ”ํ…Œ

[์ฝ”ํ…Œ ์•Œ๊ณ ๋ฆฌ๋“ฌ] ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ๋“ฌ C++

 

๋ชฉ์ฐจ

0. ์„œ๋ก 

1. ์•Œ๊ณ ๋ฆฌ๋“ฌ ์„ค๋ช…

2. ๋ฐฑ์ค€ ์ถ”์ฒœ ๋ฌธ์ œ ๋ฐ ์ฝ”๋“œ


0. ์„œ๋ก 

 ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ(Floyd-Warshall) algorithm์€ ๊ทธ๋ž˜ํ”„์—์„œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋…ธ๋“œ ์Œ์— ๋Œ€ํ•ด ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ๋“ฌ์ด๋‹ค. ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(V^3)์ด๋‹ค. ํ•„์ž๊ฐ€ ์ •๋ณด์ถฉ์ด๋ผ ์„œ๋ก ์ธ ๊ฒธ์— ๊ธฐ์ˆ ํ•˜์ง€๋งŒ, ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ์€ ์ด ์•Œ๊ณ ๋ฆฌ๋“ฌ ๊ฐœ๋ฐœ์ž์ธ "๋กœ๋ฒ„ํŠธ ํ”Œ๋กœ์ด๋“œ"์™€ "์Šคํ‹ฐ๋ธ ์›Œ์…œ"์ด ๊ฐœ๋ฐœํ–ˆ๊ณ , ์ดํ›„์— ๋กœ๋ฒ„ํŠธ ํ”Œ๋กœ์ด๋“œ๋Š” ํŠœ๋ง์ƒ์„ ๋ฐ›์•˜๋‹ค. 

 

 "๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋…ธ๋“œ์Œ์— ๋Œ€ํ•ด ์ตœ๋‹จ๊ฑฐ๋ฆฌ"๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ๋“ฌ์„ ๋งŒ๋“ค์–ด ๋‚ธ ์ด์œ ๋Š” ์‚ฌ์‹ค ์˜ค๋Š˜๋‚  ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋ฅผ ๋ณด๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ๋‚œ์ด๋„๋ฅผ ์„ ์‚ฌํ•˜๊ธฐ ์œ„ํ•จ์€ ์•„๋‹ˆ๊ณ , ํ†ต์‹  ๋„คํŠธ์›Œํฌ๊ด€๊ณ„๋ฅผ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์•Œ๊ณ ๋ฆฌ๋“ฌ์ด๋‹ค.

 ์ด ์•Œ๊ณ ๋ฆฌ๋“ฌ์„ ๊ฐœ๋ฐœํ•œ ์‹œ๊ธฐ๋Š” 1960๋…„๋Œ€ ์ดˆ๋ฐ˜์ธ๋ฐ, ๋‹น์‹œ์— ๋ฏธ๊ตญ ์ผ๋ถ€์ง€์—ญ์— ํฉ๋ฟŒ๋ ค์ ธ ์žˆ๋Š” ๋„คํŠธ์›Œํฌ ๊ด€๊ณ„๋ง์—์„œ ์ „์ฒด ๋…ธ๋“œ๊ฐ„ ์ตœ์†Œ ์ง€์—ฐ/๋น„์šฉ์„ ํ•œ๋ฒˆ์— ๊ณ„์‚ฐํ•ด์„œ "๋ผ์šฐํŒ… ๊ธฐ์ค€ํ‘œ"๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์“ฐ์˜€๋‹ค.

 

์ค‘์•™์—์„œ ์ „์ฒด ๋„คํŠธ์›Œํฌ๋ฅผ ์•Œ๊ณ ์žˆ๊ณ , ๋ชจ๋“  ๋…ธ๋“œ๊ฐ„ ์ตœ์  ๊ฒฝ๋กœ์™€ ์ง€์—ฐ์‹œ๊ฐ„, ๊ทธ๋ฆฌ๊ณ  ๋„๋‹ฌ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๊นŒ์ง€ ์•Œ ์ˆ˜ ์žˆ๊ธฐ์—, ํŒจํ‚ท์ด ๋„์ฐฉํ• ๋•Œ๋งˆ๋‹ค ๊ณ„์‚ฐํ•˜๊ฑฐ๋‚˜ ์—ฌ๋ถ€๋ฅผ ์•„๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํ•œ๋ฒˆ ๊ณ„์‚ฐํ•ด ๋‘๋ฉด O(1)๋กœ๋‹ค๊ฐ€ ๋ฝ‘์•„๋‹ค ์“ธ ์ˆ˜ ์žˆ๊ธฐ์— ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ์ด์™€ ๊ด€๋ จํ•ด์„œ๋Š” ARPA(๋ฏธ๊ตญ ๊ตญ๋ฐฉ๋ถ€ ์‚ฐํ•˜ ๊ณ ๋“ฑ์—ฐ๊ตฌ๊ณ„ํš๊ตญ) ์˜ ARPANET์˜ ํŒจํ‚ท ๊ตํ™˜ ๋„คํŠธ์›Œํฌ๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์•ŒํŒŒ๋„ท์ธ์ง€ ์•„๋ฅดํŒŒ๋„ท์ธ์ง„ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ, ์˜์–ด๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ํŽธ์ด ๋” ์ž˜ ๋‚˜์˜จ๋‹ค.

1970's ARPANET. https://www.reddit.com/r/MapPorn/comments/dory5m/arpanet_forerunner_to_the_internet_was_first_used/?tl=ko

 

 

 

์•”ํŠผ, ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ ํ”Œ๋กœ์ด๋“œ๋Š” ์ž˜ ์•ˆ๋‚˜์˜ค๋Š” ๋“ฏ ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์‹œ๊ฐ„์จ์„œ ๊ธฐ์ˆ ํ•˜๋Š” ์ด์œ ๋Š”,

์‚ฌ์‹ค ์›๋ฆฌ๋งŒ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ง€๋งŒ, ๊ธฐ์–ต์ด ์•ˆ๋‚œ๋‹ค๋ฉด ๋‹ค์Œ์„ ๊ธฐ์•ฝํ•  ์ˆ˜ ๋ฐ–์— ์—†๊ฒŒ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ๋“ฌ์ด๊ธฐ์— ํ•„์ž์˜ ๋ณต์Šต ์ฐจ ์ฒซ ์•Œ๊ณ ๋ฆฌ๋“ฌ ํฌ์ŠคํŒ…์œผ๋กœ ์†Œ๊ฐœ ํ•œ๋‹ค.

 

1. ์•Œ๊ณ ๋ฆฌ๋“ฌ ์„ค๋ช…

 ์„œ๋ก ์—์„œ ๋ณธ ARPANET์˜ ๋ณต์žกํ•œ ๋„คํŠธ์›Œํฌ ๊ด€๊ณ„๋ฅผ ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์„ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”๋กœ ๋งŒ๋“œ๋Š”๊ฒŒ ๋งž๋‹ค. 

์™ผ์ชฝ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํ•œ ๊ทธ๋ž˜ํ”„๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ, ์˜ค๋ฅธ์ชฝ์˜ ํ‘œ ๊ทธ cost๋ฅผ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. 

 

์—ฌ๋‹ด์ด์ง€๋งŒ, ํ•„์ž๋Š” ๋ธ”๋กœ๊ทธ ๊ทธ๋ฆผ ํŽธ์ง‘์„ figma๋กœ ํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์—๋Š” ์ •๋ง ๋”์ฐํ•˜๊ฒŒ๋„ ํ‘œ๊ฐ€ ์—†๋‹ค. ๊ฐ€์‹œ์„ฑ์€ ์–‘ํ•ด ๋ฐ”๋ž€๋‹ค.

 

 

์šฐ์„ , ๋ณธ์ธ ๋…ธ๋“œ์—์„œ ๋ณธ์ธ์œผ๋กœ ๊ฐ€๋Š” cost๋Š” 0์ด๊ณ , ํ˜„์žฌ ๊ทธ๋ž˜ํ”„์—์„œ๋Š” ๋ชจ๋“  ์ˆ˜๋ฅผ ํ•œ๋ฒˆ์— ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋‹ˆ, ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ์ฝ”์ŠคํŠธ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค๋ฉด,

์ด๋ ‡๊ฒŒ ๋Œ€์นญ์ ์ธ ํ‘œ๊ฐ€ ๋‚˜์˜จ๋‹ค.

ํ•˜์ง€๋งŒ, ์ผ๋ถ€ ๊ฒฝ์šฐ๋Š” ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ๊ฒฝ์œ ํ•ด ๊ฐ€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋” cost๊ฐ€ ์ ์€ ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ด๋ฅผํ…Œ๋ฉด, 2 - 4 ์ธ ๊ฒฝ์šฐ์—๋Š”, ์ผ์ง์„ ์œผ๋กœ ๊ฐ€๋ฉด 8 cost๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ, 3์„ ๊ฑฐ์น˜๊ฒŒ ๋˜๋ฉด 5 + 2์—์„œ 7์˜ cost๋งŒ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

์ด๋ ‡๊ฒŒ, ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๋ฐ”๋€ ๋ถ€๋ถ„์ด, ๋” ๋น ๋ฅธ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„ ๋ฐ”๊พผ ๊ฒฝ์šฐ๋‹ค.

 

์ด์ œ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ฅผ ์ฑ„์šฐ๋ฉด ๋˜๋Š”๋ฐ, ์ด๋ฅผ 3์ค‘ for๋ฌธ์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

#define INF 1e9

int N;
vector<vector<int>> table;
vector<vector<int>> costs;


void main() {
	int a,b,c;
	cin >> N;
    
    table.resize(N+1, vector<int>(N+1, INF); 
    costs.resize(N+1, vector<int>(N+1, INF); 
    
    for(int i = 0; i < N; ++i) {
    	cin >> a >> b >> c;
        table[a][b] = min(c, table[a][b]);
        table[b][a] = min(c, table[b][a]);
    }
    
    for(int k = 1; k < N+1; ++k) {
    	for(int i = 1; i < N+1; ++i) {
        	for(int j = 1; j < N+1; ++j) {
                table[i][j] = min(table[i][k] + table[k][j] , table[i][j]);
            }
        }
    }

	return 0;
}

 

 ํƒญ์ด ์ข€ ์ด์ƒํ•œ๋ฐ์— ๋“ค์–ด๊ฐ€์žˆ๋Š”๋ฐ, ์ด๊ฑด tistory ์ฝ”๋“œ๋ธ”๋Ÿญ์—์„œ ์ฝ”๋“œ๋ฅผ ์“ฐ๊ฒŒ ๋˜๋ฉด ์˜ค๋ฅ˜๋กœ ํƒญ์ด ๋“ค์–ด๊ฐ€๋Š” ๋“ฏ ํ•˜๋‹ค. 

 ๋˜ํ•œ, INF์—์„œ 1e9๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ ๋Š”, min์—์„œ ๋”ํ•˜๊ธฐ ํ• ๋•Œ, 0x7fffffff์„ ์“ฐ๋ฉด, overflow๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 ๋˜ํ•œ, ์ž…๋ ฅ์—์„œ min์„ ์“ฐ๋Š” ์ด์œ  ๋˜ํ•œ, ๊ฐ™์€ ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๊ฐ„์„ ์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

for๋ฌธ์˜ ๋ฌธ์ž ์ˆœ์„œ์— ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค!

ํ”Œ๋กœ์ด๋“œ์˜ ์˜๋„๋Š”,

1. ์ง์ ‘ ์—ฐ๊ฒฐ๋œ ๊ฐ„์„ ๋งŒ ์•Œ๊ณ ์žˆ์„ ๋•Œ,

2. ๋‹ค๋ฅธ ์ง€์ ์„ ๊ฒฝ์œ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋” ํšจ์œจ์ ์ผ๋•Œ

3. ํ•ด๋‹น ์ง€์ ์„ ๊ฒฝ์œ ํ•œ๋‹ค.

 

์ด๋Ÿฐ ์‚ฌ๊ณ ์ด๊ธฐ ๋•Œ๋ฌธ์—,

์œ„ ์ฝ”๋“œ์—์„œ ๊ฒฝ์œ ์ง€์ธ k๋ฅผ ๊ฒฝ์œ ์ง€๋กœ ์‚ผ์„ ๋•Œ, "i์—์„œ j๋กœ ๊ฐ€๋Š” ๊ฒฝ์šฐ"์— ์ˆ˜ํ˜œ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ณ„์‚ฐํ•˜

๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

 

์ฐธ๊ณ ๋กœ ๊ธฐ์ˆ ํ•˜์ž๋ฉด, ์œ„ ์ฝ”๋“œ์—์„œ i, j, k ์ˆœ์œผ๋กœ ์ž‘์„ฑํ•˜์—ฌ, "i์—์„œ j๋กœ ๊ฐˆ ๋•Œ, k๋ฅผ ๊ฒฝ์œ ํ•ด๋„ ๋˜๋Š”๊ฐ€?"๋ฅผ ๋‘๊ณ  ์ฝ”๋”ฉ์„ ํ•˜๊ฒŒ๋˜๋ฉด, ์ด ๋กœ์ง์„ ๋‘๋ฒˆ ์ด์ƒ ๋Œ๋ ค์•ผํ•˜๋Š” ๋ถˆ์ƒ์‚ฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ,

 

๋งŒ์ผ ์œ„์˜ ์ฝ”๋“œ๊ฐ€ ๊ฒฝ์šฐ A, " i์—์„œ j๋กœ ๊ฐˆ ๋•Œ, k๋ฅผ ๊ฒฝ์œ ํ•ด๋„ ๋˜๋Š”๊ฐ€?"๊ฐ€ ๊ฒฝ์šฐ B๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ,

๊ฒฝ์šฐ A๋Š” ๊ฒฝ์œ ์ง€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‹œ์ž‘์ ๊ณผ ๋์ ์„ ๊ณ„์‚ฐํ•˜๊ธฐ์—, ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ๋น ์ง์—†์ด ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์œผ๋‚˜,

 

๊ฒฝ์šฐ B๋Š” "์ƒˆ๋กœ์šด ๊ฒฝ์œ ์ง€๊ฐ€ ๋šซ๋ฆฌ๋ฉฐ ๋ฐœ์ƒํ•˜๋Š” ์ƒˆ๋กœ์šด ๊ฒฝ์šฐ"๋ฅผ ๊ณ„์‚ฐํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

 

 

๊ฒฝ๋กœ ๋ณต์›์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ๊ธ€์—์„œ ์ด์–ด์„œ ๊ธฐ์ˆ ํ•˜๊ฒ ๋‹ค.

 

(๋งํฌ ์ฒจ๋ถ€ ์˜ˆ์ •)

 

2. ๋ฐฑ์ค€ ์ถ”์ฒœ๋ฌธ์ œ ๋ฐ ์ฝ”๋“œ

https://www.acmicpc.net/problem/11403

 

์‹ค๋ฒ„ ๋ฌธ์ œ์ธ๋ฐ, ํ•œ๋ฒˆ ํ’€์–ด๋ณด๋ฉฐ ๊ฐ์„ ์ตํ˜€๋ณด๊ณ ,

 

 

https://www.acmicpc.net/problem/11404

 

๊ณจ๋“œ ํ•˜์œ„๊ถŒ ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด table์„ ์งœ๋ณด๋Š” ์—ฐ์Šต ํ›„์— 

 

 

https://www.acmicpc.net/problem/11780

 

์กฐ๊ธˆ ์–ด๋ ค์šด ํ”Œ๋กœ์ด๋“œ๊นŒ์ง€ ํ’€๋ฉด ๋  ๋“ฏ ํ•˜๋‹ค.

๊ฐ ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ๋„ ํ’€์ด๋ฅผ ์˜ฌ๋ฆด ์˜ˆ์ •์ด๋‹ค.

 

 

 

 


26.02.11 ์ง‘ํ•„