๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm๐Ÿฐ/๋ฐฑ์ค€

[๋ฐฑ์ค€] 11403 ๊ฒฝ๋กœ ์ฐพ๊ธฐ Floyd Warshall

by Jouureee 2021. 2. 18.

๋ฌธ์ œ : 

www.acmicpc.net/problem/11403

 

11403๋ฒˆ: ๊ฒฝ๋กœ ์ฐพ๊ธฐ

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

www.acmicpc.net

๋ถ„์„ :

์ด ๋ฌธ์ œ๋Š” ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•ด๋ณด์•˜๋‹ค.

๋ฐฑ์ค€ ๋…ผ์˜ ๋ณด๋‹ˆ๊นŒ DFS, BFS ๋กœ๋„ ํ’€ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„ ๋ณด์˜€๋‹ค.

ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ์€ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ๋Š” ๋‹ฌ๋ฆฌ ๋ชจ๋“  ์ •์ ์—์„œ ๋ชจ๋“  ์ •์ ์œผ๋กœ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ€์žฅ ์ ์€ ๋น„์šฉ์„ ํ•˜๋‚˜์”ฉ ์„ ํƒํ–ˆ๋‹ค๋ฉด ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ์€ ๊ฑฐ์ณ๊ฐ€๋Š” ์ •์ ์„ ๊ธฐ์ค€์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด ํฌ์ธํŠธ์˜€๋‹ค. 

ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ์€ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์˜๊ฑฐํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

 

๊ฐ€์žฅ ์ดํ•ด๋˜๋Š” ๋˜๋ชฉ์ด๋ผ ํ•˜๋ฉด์€ X์—์„œ Y๋กœ ๊ฐ€๊ณ  ์‹ถ์„ ๋•Œ

 

๋”๋ณด๊ธฐ

X์—์„œ Y๋กœ ๊ฐ€๋Š” ์ตœ์†Œ ๋น„์šฉ VS X์—์„œ 1(๊ฑฐ์ณ๊ฐ€๋Š” ๋…ธ๋“œ)๋กœ ๊ฐ€๋Š” ์ตœ์†Œ ๋น„์šฉ + 1์—์„œ Y๋กœ ๊ฐ€๋Š” ์ตœ์†Œ ๋น„์šฉ  

์ด์—ˆ๋‹ค.

 

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— 3๊ฐœ์˜ for๋ฌธ์ด ํ•„์š”ํ•˜๊ณ  ๊ฑฐ์ณ๊ฐ€๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•ด ์‹œ์ž‘ ๋…ธ๋“œ, ๋ ๋…ธ๋“œ ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚ค๋ฉฐ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์„ ๊ฒ€์ƒ‰ํ•œ๋‹ค.

 

c++ ์ฝ”๋“œ :

//
//  11403_path.cpp
//  SOMA๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป
//
//  Created by JoSoJeong on 2021/02/18.
//

#include <stdio.h>
#include <iostream>

#define MAX 101
using namespace std;

int path[MAX][MAX];

void find_path(int n){
    int d[n][n];
    
    for(int i = 0; i< n; i++){
        for(int j = 0; j <n; j++){
            d[i][j] = path[i][j];
        }
    }
    
    //k ๊ฑฐ์ณ๊ฐ€๋Š” ๋…ธ๋“œ
    for(int k = 0; k< n; k++){
        //i ์ถœ๋ฐœ ๋…ธ๋“œ
        for(int i = 0; i <n; i++){
            //j ๋„์ฐฉ ๋…ธ๋“œ
            for(int j = 0; j <n; j++){
                
                if(d[i][k] >0 && d[k][j] > 0){ //๊ฑฐ์ณ ๊ฐ€๋Š” ๊ธธ ์žˆ์œผ๋ฉด
                    d[i][j] = 1;
                }
            }
        }
    }
    
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            cout << d[i][j] << " ";
        }
        cout << endl;
    }
    
    
    
    
}

int main(){
    int n;
    cin >> n;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            cin >> path[i][j];
        }
    }
    
//    for(int i = 0; i< n; i++){
//        for(int j = 0; j <n; j++){
//            cout << path[i][j] << " ";
//        }
//        cout << endl;
//    }
    
    find_path(n);
    return 0;
}

๋Œ“๊ธ€