๐Ÿ’ป

[์•Œ๊ณ ๋ฆฌ์ฆ˜] [์ตœ๋‹จ๊ฑฐ๋ฆฌ ์™„์ „์ •๋ณต] ๋‹ค์ต์ŠคํŠธ๋ผ - ์ตœ์†Œ๋น„์šฉ๊ตฌํ•˜๊ธฐ ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜/๊ธฐ๋ณธ๊ธฐ ๋‹ค์ง€๊ธฐ

[์•Œ๊ณ ๋ฆฌ์ฆ˜] [์ตœ๋‹จ๊ฑฐ๋ฆฌ ์™„์ „์ •๋ณต] ๋‹ค์ต์ŠคํŠธ๋ผ - ์ตœ์†Œ๋น„์šฉ๊ตฌํ•˜๊ธฐ

๋˜ํšจ๋‹ˆ 2020. 3. 4. 00:20

๋‹ค์ต์ŠคํŠธ๋ผ

if(dist[to] > dist[from] + cost){   
	dist[to] = dist[from] + cost;
}

 

- D[i] = ์‹œ์ž‘ ->  i ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ

- C[i] = i๊ฐ€ ์ฒดํฌ๋˜์–ด ์žˆ์œผ๋ฉด true, ์•„๋‹ˆ๋ฉด false

 

1. ์ฒดํฌ๋˜์–ด ์žˆ์ง€ ์•Š๋Š” ์ •์  ์ค‘์—์„œ D์˜ ๊ฐ’์ด ๊ฐ€์žฅ ์ž‘์€ ์ •์  x๋ฅผ ์„ ํƒํ•œ๋‹ค.

2. x๋ฅผ ์ฒดํฌํ•œ๋‹ค.

3. x์™€ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ •์ ์„ ๊ฒ€์‚ฌํ•œ๋‹ค.

  • ๊ฐ„์„ ์„ (x,y,z)๋ผ๊ณ  ํ–ˆ์„ ๋•Œ
  • d[y] > d[x] + z ์ด๋ฉด ๊ฐฑ์‹ ํ•ด์ค€๋‹ค.

1, 2, 3๋‹จ๊ณ„๋ฅผ ๋ชจ๋“  ์ •์ ์„ ์ฒดํฌํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์†ํ•œ๋‹ค. 

 

- ๋ชจ๋“ ์ •์  ์„ ํƒํ•˜๋ฏ€๋กœ(V-1) X ์„ ํƒ์„ ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ O(V) = O(V^2)

 

1๋ฒˆ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ 2, 5๋ฒˆ ๋…ธํŠธ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘ ๊ฐ€์žฅ์งง์€ ๊ณณ์„ ๋‹ค์Œ์œผ๋กœ ์„ ํƒํ•œ๋‹ค.
1 ->2 ->5 ๋กœ 5๋ฒˆ ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ 3์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค. 1->2->4 ๋กœ 4๋ฒˆ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ 10์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.  

 

 

 

 

์ธ์ ‘ํ–‰๋ ฌ์„ ์ด์šฉํ•œ ๊ตฌํ˜„

for(int i=1; i<=n; i++){
	dist[i] = inf;
}
dist[start] = 0;
for(int k=0; k<n-1; k++){
	int m = inf+1;
    int x = -1;
    for(int i=1; i<=n; i++){ // ์„ ํƒ์— ๋˜์–ด์žˆ์ง€ ์•Š์œผ๋ฉด์„œ
    	if(check[i] == false && m > dist[i]){ // check๊ฐ€ false์ด๊ณ  dist[i]๊ฐ€ ์ตœ์†Ÿ๊ฐ’๋ณด๋‹ค ์ž‘์€
        	m = dist[i];
            x = i;
        }
    }
    check[x] = true; // ํ•ด๋‹น ์ •์ ์„ ์„ ํƒ
    for(int i=1; i<=n; i++){ 
    	if(dist[i] > dist[x] + a[x][i]){
        	dist[i] = dist[x] + a[x][i];
        }
    }
}
        

์ธ์ ‘๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ๊ตฌํ˜„

for(int i=1; i<=n; i++){
	dist[i] = inf;
}
dist[start] = 0;
for(int k=0; k<n-1; k++){
	int m = inf+1;
    int x = -1;
    for(int i=1; i<=n; i++){ // ์„ ํƒ์— ๋˜์–ด์žˆ์ง€ ์•Š์œผ๋ฉด์„œ
    	if(check[i] == false && m > dist[i]){ // check๊ฐ€ false์ด๊ณ  dist[i]๊ฐ€ ์ตœ์†Ÿ๊ฐ’๋ณด๋‹ค ์ž‘์€
        	m = dist[i];
            x = i;
        }
    }
    check[x] = true; // ํ•ด๋‹น ์ •์ ์„ ์„ ํƒ
    for(int i=1; i<=a[x].size(); i++){
    	int y = a[x][u].to;  
    	if(dist[y] > dist[x] + a[x][i].cost){
        	dist[y] = dist[x] + a[x][i].cost;
        }
    }
}
        

 

์—ฐ์Šต๋ฌธ์ œ

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

 

1916๋ฒˆ: ์ตœ์†Œ๋น„์šฉ ๊ตฌํ•˜๊ธฐ

์ฒซ์งธ ์ค„์— ๋„์‹œ์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 1,000)์ด ์ฃผ์–ด์ง€๊ณ  ๋‘˜์งธ ์ค„์—๋Š” ๋ฒ„์Šค์˜ ๊ฐœ์ˆ˜ M(1 ≤ M ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์…‹์งธ ์ค„๋ถ€ํ„ฐ M+2์ค„๊นŒ์ง€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฒ„์Šค์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋จผ์ € ์ฒ˜์Œ์—๋Š” ๊ทธ ๋ฒ„์Šค์˜ ์ถœ๋ฐœ ๋„์‹œ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋‹ค์Œ์—๋Š” ๋„์ฐฉ์ง€์˜ ๋„์‹œ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง€๊ณ  ๋˜ ๊ทธ ๋ฒ„์Šค ๋น„์šฉ์ด ์ฃผ์–ด์ง„๋‹ค. ๋ฒ„์Šค ๋น„์šฉ์€ 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 100,000๋ณด๋‹ค ์ž‘์€ ์ •์ˆ˜์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  M+3์งธ ์ค„์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ตฌ๊ฐ„

www.acmicpc.net

 

๋ฐ˜์‘ํ˜•
Comments