할머니의 콤퓨타 도전기

BOJ 11657 타임머신 본문

Algorithm/Problem Solving

BOJ 11657 타임머신

ji.o.n.e 2020. 8. 17. 16:07
  • 문제 설명

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


  • 문제 풀이

벨만 포드 알고리즘 문제입니다. 

https://jioneprogstdy.tistory.com/32

 

벨만 포드 알고리즘(Bellman-Ford Algorithm)

Bellman-Ford Algorithm 시작점으로 부터 다른 모든 정점으로의 최단 경로를 구하는 다익스트라 알고리즘과 유사합니다. 그러나 벨만 포드 알고리즘은 간선 cost가 음수인 경우에도 사용할 수가 있습니

jioneprogstdy.tistory.com

다만 주의할 점이 있는데, 무한 루프가 없을 때 가능한 최단 경로의 최댓값은 (정점 수-1) * (최대거리 값) 이므로 4byte 정수형 값의 범위 안에 속합니다.

그러나 위 문제에서는 모든 간선이 -10000을 가지고 있다면 N번 루프 안에서의 계산의 절대값이 4byte 정수형 값을 넘겨 오버플로우가 발생할 가능성이 있습니다. 따라서 안전하게 8byte 정수형 값을 사용해야합니다.


  • 소스 코드
#include <bits/stdc++.h>
using namespace std;

vector<pair<int, int>> v[501];
long long dist[501];
long long INF = 1e18;
int main()
{
    cin.tie(0);
    ios_base::sync_with_stdio(0);

    int n, m;
    int a, b, c;
    cin >> n >> m;
    for (int i = 0; i < m; i++)
    {
        cin >> a >> b >> c;
        v[a].push_back({b, c});
    }
    bool minusCycle = false;
    fill(dist, dist + n + 1, INF);
    dist[1] = 0;

    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            for (auto &it : v[j])
            {
                if (dist[j] != INF && dist[it.first] > it.second + dist[j])
                {
                    dist[it.first] = it.second + dist[j];
                    if (i == n)
                        minusCycle = true;
                }
            }
        }
    }
    if (minusCycle)
        cout << -1;
    else
    {
        for (int i = 2; i <= n; i++)
        {
            dist[i] != INF ? cout << dist[i] <<'\n' : cout << -1 << '\n';
        }
    }

    return 0;
}

'Algorithm > Problem Solving' 카테고리의 다른 글

Programmers: 크레인 인형뽑기 게임  (0) 2021.04.27
Programmers: 모의고사  (0) 2020.08.18
[C++] Programmers: N으로 표현  (0) 2020.08.16
[C++] Programmers: 체육복  (0) 2020.08.16
[C++] Programmers: 더 맵게  (0) 2020.08.13
Comments