Coding Test/BaekJoon_C++

백준 11657 <타임머신> C++

JunOnJuly 2024. 3. 14. 19:31
728x90

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

 

11657번: 타임머신

첫째 줄에 도시의 개수 N (1 ≤ N ≤ 500), 버스 노선의 개수 M (1 ≤ M ≤ 6,000)이 주어진다. 둘째 줄부터 M개의 줄에는 버스 노선의 정보 A, B, C (1 ≤ A, B ≤ N, -10,000 ≤ C ≤ 10,000)가 주어진다. 

www.acmicpc.net


 

 

백준 11657 <타임머신> Python

https://www.acmicpc.net/problem/11657 11657번: 타임머신 첫째 줄에 도시의 개수 N (1 ≤ N ≤ 500), 버스 노선의 개수 M (1 ≤ M ≤ 6,000)이 주어진다. 둘째 줄부터 M개의 줄에는 버스 노선의 정보 A, B, C (1 ≤ A, B

dev-diary-0717.tistory.com

이전에 올린 포스팅을 C++ 코드로 바꾸었습니다. 다만 자료형을 정할 때 int 의 경우 under flow 가 발생해 추가 출력이 발생할 수 있습니다. long 이나 long long 을 사용해야 제대로 된 출력값이 나옵니다.


#include <iostream>
//
#include <array>
#include <vector>
//
#include <algorithm>

using namespace std;

// 벨만포드
array<long long, 501> bell_ford(vector<array<int, 3>> dist_vec, int N)
{
    // 시스템상 최댓값
    long long inf = 60000000;

    // 최솟값 거리 목록
    array<long long, 501> dists;
    dists.fill(inf);
    dists[1] = 0;

    // N 번 순회
    for (int i = 0; i < N; i++)
    {
        // dist_vec 데이터 순회
        for (auto data : dist_vec)
        {
            // 거쳐갈 노드
            int edge_node = data[0];
            // 목표 노드
            int next_node = data[1];
            // 이동 거리
            int move_cost = data[2];
           
            // 거쳐갈 노드가 도달할 수 있는 노드면
            if (dists[edge_node] != inf)
            {
                // 거쳐가는 거리가 최단 거리보다 짧으면
                if (dists[edge_node] + move_cost < dists[next_node])
                {
                    // N-1 번째 순회에서도 최단거리가 최신화된다면 순환 존재
                    if (i == N - 1) dists[0] = 0;
                    // 최단거리 최신화
                    dists[next_node] = dists[edge_node] + move_cost;
                }
            }
        }
    }

    return dists;
}

int main(void)
{
    int N, M;
    cin >> N >> M;

    // 시스템상 최댓값
    long long inf = 60000000;

    // 거리 데이터 목록
    vector<array<int, 3>> dist_vec;
    // 데이터 기록
    for (int i = 0; i < M; i++)
    {
        int A, B, C;
        cin >> A >> B >> C;

        dist_vec.push_back({ A, B, C });
    }

    // 벨만포드
    array<long long, 501> dists = bell_ford(dist_vec, N);
   
    if (dists[0] == 0)
    {
        cout << -1;
        return 0;
    }
    else
    {
        for (int i = 2; i < N + 1; i++)
        {
            if (dists[i] == inf) cout << -1 << "\n";
            else cout << dists[i] << "\n";
        }
        return 0;
    }
}  

 

728x90

'Coding Test > BaekJoon_C++' 카테고리의 다른 글

백준 2252 <줄 세우기> C++  (0) 2024.03.25
백준 1717 <집합의 표현> C++  (1) 2024.03.15
백준 9935 <문자열 폭발> C++  (0) 2024.03.13
백준 2592 <대표값> C++  (0) 2024.03.06
백준 1967 <트리의 지름> C++  (0) 2024.03.03