오늘의 알고리즘

[C++] 백준 11403 경로 찾기

하늘하늘 . 2022. 9. 21. 22:34
#include <iostream>
#include <vector>
#include <queue>  
 
int N = 0;
int vec[101][101] = {};
 
void floyd() 
{
    for (int k = 0; k < N; ++k) 
    {
        for (int i = 0; i < N; ++i) 
        {
            for (int j = 0; j < N; ++j) 
            {
                if (vec[i][k] && vec[k][j])
                    vec[i][j] = 1;
            }
        }
    }
}
 
int main()
{
    std::cin >> N;
 
    for (int i = 0; i < N; ++i)
    {
        for (int j = 0; j < N; ++j)
        {
            std::cin >> vec[i][j];
        }
    }
 
    floyd();
 
    for (int i = 0; i < N; ++i)
    {
        for (int j = 0; j < N; ++j)
        {
            std::cout << vec[i][j] << " ";
        }
 
        std::cout << "\n";
    }
 
    return 0;
}

플로이드와샬 알고리즘을 이용했습니다.

i -> k -> j를 이용해서 도달할 수 있다라는 걸 이용했습니다.

여기서 k는 임의의 새로운 위치입니다.

그렇기 때문에 k, i, j 순서로 만들어야 i -> k -> j는 i -> j를 할 수 있습니다.