BOJ 백준 11657 : 타임머신
Updated:
시작하면서
이번 문제는 벨만 포드 알고리즘(Bellman-Ford Algorithm) 을 사용해 해결하는 문제이다.
문제 이해
이 문제는 이전에 풀었던 웜홀 문제와 동일한 벨만 포드 알고리즘 문제이다. 문제를 해결하는 방법은 동일하고, 엣지 케이스만 설명하겠다.
- 버스 노선의 최소,최대 시간이 -10,000~10,000이고, 노선의 개수가 최대 6,000이므로 int_32 자료형을 사용하면 오버플로우가 발생할 수 있다.
- 만약 음의 사이클이 존재하는 경우가 있다고 해도, 시작점에서 해당 사이클에 접근하는 경로가 없으면 음의 사이클이 아니다.
해결
#include <iostream>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;
#define MAX 99999999
class EdgeInfo
{
public:
int destination, time;
};
vector<long long> GetBellmanFord(const vector<vector<EdgeInfo>>& edgeInfoVector)
{
vector<long long> result;
result.assign(edgeInfoVector.size(), MAX);
result[1] = 0;
for (int loop = 0; loop < edgeInfoVector.size() - 1; loop++)
{
for (int i = 1; i < edgeInfoVector.size(); i++)
{
for (int j = 0; j < edgeInfoVector[i].size(); j++)
{
if (result[i] == MAX)
{
continue;
}
int destination = edgeInfoVector[i][j].destination;
int time = edgeInfoVector[i][j].time;
long long sumOfTime = result[i] + time;
if (result[destination] > sumOfTime)
{
result[destination] = sumOfTime;
}
}
}
}
for (int i = 1; i < edgeInfoVector.size(); i++)
{
for (int j = 0; j < edgeInfoVector[i].size(); j++)
{
if (result[i] == MAX)
{
continue;
}
int destination = edgeInfoVector[i][j].destination;
int time = edgeInfoVector[i][j].time;
long long sumOfTime = result[i] + time;
if (result[destination] > sumOfTime)
{
result.clear();
return result;
}
}
}
for (int i = 2; i < result.size(); i++)
{
if (result[i] == MAX)
{
result[i] = -1;
}
}
return result;
}
int main()
{
// sync off
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
// sync off
vector<vector<EdgeInfo>> edgeInfoVector;
int N, M;
cin >> N >> M;
edgeInfoVector.resize(N + 1);
for (int i = 0; i < M; i++)
{
int start, destination, time;
cin >> start >> destination >> time;
edgeInfoVector[start].push_back({ destination, time });
}
vector<long long> result = GetBellmanFord(edgeInfoVector);
if (result.empty() == true)
{
cout << "-1";
}
else
{
for (int i = 2; i < result.size(); i++)
{
cout << result[i] << "\n";
}
}
return 0;
}
Leave a comment