본문 바로가기

백준/골드

[백준 11404번] 플로이드 (C++)

문제링크 : https://www.acmicpc.net/problem/11404

 

11404번: 플로이드

첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 987654321
#define pii pair <int, int>

int arr[101][101];
int N, M, a, b, c;

int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    cin >> N >> M;

    for(int i=1; i<=N; i++)
    {
        for(int j=1; j<=N; j++)
        {
            if(i!=j) arr[i][j]=MAX; //큰 수로 초기화
        }
    }

    for(int i=0; i<M; i++)
    {
        cin >> a >> b >> c;
        arr[a][b] = min(arr[a][b], c);  //값 할당
    }

    for(int k=1; k<=N; k++)
    {
        for(int i=1; i<=N; i++)
        {
            for(int j=1; j<=N; j++)
            {
                arr[i][j] = min(arr[i][j], arr[i][k]+arr[k][j]); //플로이드 와샬 알고리즘
            }
        }
    }
    
    for(int i=1; i<=N; i++)
    {
        for(int j=1; j<=N; j++)
        {
            cout << (arr[i][j] == MAX ? 0 : arr[i][j]) << " ";  //못가면 0, 갈 수 있으면 해당값
        }
        cout << "\n";
    }

    return 0;
}

플로이드 와샬알고리즘 문제이다.

여기서 도시 A -> B로 가는 모든 경우의 수에 대해서 최단값을 조사하기에 처음에 배열을 MAX로 초기화하고 시작한다.

이때 i==j일 경우 같은 곳이라서 비용이 없으므로 이때는 제외한다.

 

그 다음에 도시와 비용을 입력받고 맞는 비용을 할당해준다.

이후 플로이드 와샬 알고리즘을 이용하여 모든 경우의 수에 대해 값을 할당해준다.

만약 위 알고리즘을 돌렸는데, 값이 MAX 그대로라면 갈 수 없는 곳이기에 0을 출력하고 이외에는 알고리즘으로 구한 해당 값을 출력해준다.