๐Ÿ“ฆ Chango/๐Ÿฃ EDOC

[Segfault][BOJ][C++] ๋ฐฑ์ค€ 1753๋ฒˆ : ์ตœ๋‹จ๊ฒฝ๋กœ

์„ ๋‹ฌ 2021. 11. 16. 23:57
๋ฐ˜์‘ํ˜•

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

 

1753๋ฒˆ: ์ตœ๋‹จ๊ฒฝ๋กœ

์ฒซ์งธ ์ค„์— ์ •์ ์˜ ๊ฐœ์ˆ˜ V์™€ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ E๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) ๋ชจ๋“  ์ •์ ์—๋Š” 1๋ถ€ํ„ฐ V๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์‹œ์ž‘ ์ •์ ์˜ ๋ฒˆํ˜ธ K(1 ≤ K ≤ V)๊ฐ€

www.acmicpc.net

๋ฌธ์ œ

๋ฐฉํ–ฅ๊ทธ๋ž˜ํ”„๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ์ฃผ์–ด์ง„ ์‹œ์ž‘์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ์œผ๋กœ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋‹จ, ๋ชจ๋“  ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๋Š” 10 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ •์ ์˜ ๊ฐœ์ˆ˜ V์™€ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ E๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) ๋ชจ๋“  ์ •์ ์—๋Š” 1๋ถ€ํ„ฐ V๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์‹œ์ž‘ ์ •์ ์˜ ๋ฒˆํ˜ธ K(1 ≤ K ≤ V)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์…‹์งธ ์ค„๋ถ€ํ„ฐ E๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ๊ฐ ๊ฐ„์„ ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์„ธ ๊ฐœ์˜ ์ •์ˆ˜ (u, v, w)๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ด๋Š” u์—์„œ v๋กœ ๊ฐ€๋Š” ๊ฐ€์ค‘์น˜ w์ธ ๊ฐ„์„ ์ด ์กด์žฌํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. u์™€ v๋Š” ์„œ๋กœ ๋‹ค๋ฅด๋ฉฐ w๋Š” 10 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์ •์  ์‚ฌ์ด์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ„์„ ์ด ์กด์žฌํ•  ์ˆ˜๋„ ์žˆ์Œ์— ์œ ์˜ํ•œ๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„๋ถ€ํ„ฐ V๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ, i๋ฒˆ์งธ ์ค„์— i๋ฒˆ ์ •์ ์œผ๋กœ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ์˜ ๊ฒฝ๋กœ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. ์‹œ์ž‘์  ์ž์‹ ์€ 0์œผ๋กœ ์ถœ๋ ฅํ•˜๊ณ , ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” INF๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

 

ํ’€์ด 1 : ๋Ÿฐํƒ€์ž„์—๋Ÿฌ (Segmentation Fault)

๋ฐ”๋กœ ์ž๋ฃŒ๊ตฌ์กฐ ์ˆ˜์—… ๋…น๊ฐ•์— ๋‹ค์ต์ŠคํŠธ๋ผ ๋‹จ์›์„ ์ฐพ์•„ ๋“ฃ๊ณ  ์—ด์‹ฌํžˆ ๋จธ๋ฆฌ์งœ๋‚ด์„œ ๊ตฌํ˜„ํ–ˆ๋‹ค

๋‹น์—ฐํ•˜๊ฒŒ ์ธ์ ‘๋ฐฐ์—ด์„ ์‚ฌ์šฉํ–ˆ๋‹ค

#include <iostream>

using namespace std;

int main() {
    
    //์ž…๋ ฅ
    int v,e,k;
    cin >> v >> e >> k;
    int g[v+1][v+1];  //๊ฐ ๋…ธ๋“œ์™€ ๊ฐ„์„  ๊ฐ€์ค‘์น˜๋ฅผ ๊ธฐ๋กํ•œ ๊ทธ๋ž˜ํ”„
    for(int i=0; i<v+1; i++){
        for(int j=0; j<v+1; j++){
            g[i][j] = 200000;
        }
    }
    int d[v+1];    //k์—์„œ i๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ
    bool visited[v+1]; //๋ฐฉ๋ฌธ์—ฌ๋ถ€
    
    for(int i=0; i<e; i++){
        int depart, arrive, weight;
        cin >> depart >> arrive >> weight;
        if(g[depart][arrive] > weight){
            g[depart][arrive] = weight;
        }
    }
    
    
    //์ดˆ๊ธฐํ™”
    for(int i=1; i<=v; i++){
        d[i] = g[k][i];
        visited[i] = false;
    }
    d[k] = 0;
    visited[k] = true;
    
    
    //๊ณ„์‚ฐ
    for(int i=0; i<v; i++){
        
        //d์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์ธ๋ฑ์Šค x ์ฐพ์•„๋‚ด๊ธฐ
        int tmp = 200001;    //๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€์˜ ๊ธธ์ด
        int x;
        for(int i=1; i<=v; i++){
            if(!visited[i] && tmp > d[i]){
                tmp = d[i];
                x = i;
            }
        }
        
        visited[x] = true;
        
        //๋ฐฉ๋ฌธ๋˜์ง€ ์•Š์€ ๋…ธ๋“œ๋“ค์— ํ•œํ•ด ๋” ์งง์€๊ฑฐ๋ฆฌ๋ฅผ d์— ๋„ฃ๋Š”๋‹ค
        for(int j=1; j<=v; j++){
            if(!visited[j]){
                if(d[j] > d[x] + g[x][j]){
                    d[j] = d[x] + g[x][j];
                }
            }
        }
    }
    
    
    //์ถœ๋ ฅ
    for(int i=1; i<=v; i++){
        if(d[i] == 200001)
            cout << "INF";
        else
            cout << d[i] << "\n";
    }
    
    
    return 0;
}

ใ…‹ Segmentation ์˜ค๋ฅ˜๊ฐ€ ๋œฌ๋‹ค.. ํ—ˆ๋ฌดํ•˜๋‹ค ์ง„์งœ

๊ฒŒ์‹œํŒ์„ ๋’ค์ ธ๋ณด๋‹ˆ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๋ž€๋‹ค.

 

๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์ด 256MB ์ธ๋ฐ

๋‚ด ์ฝ”๋“œ์—์„œ๋Š” ๋งŒ์•ฝ ๋…ธ๋“œ๊ฐ€ 20000๊ฐœ์ธ ๊ฒฝ์šฐ

์ธ์ ‘๋ฐฐ์—ด g ๊ฐ€ 20000 * 20000 * 4byte(์ •์ˆ˜ํ˜•์ž๋ฃŒ) = 1600MB ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ.....

 ๋„ ์–ด์ฉŒ๋ฉด ์ข‹๋‹ˆ..

์ด์— ์ธ์ ‘๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”๋ฐ...

 

ํ’€์ด2

๋‚œ ์ด๋ฏธ ์ง€์ณค๋‹ค

๋‹ค์Œ์— ๋˜ ์˜ค๊ฒ ๋‹ค

๋ฐ˜์‘ํ˜•