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 |