#include <iostream>
#include <vector>
#include <tuple>
using namespace std;
#define Max 60000001
long long city[501] = {};
vector<tuple<int, int, long long>> vec = {};
int main()
{
int N = 0;
int M = 0;
cin >> N >> M;
for (int i = 1; i <= N; ++i)
{
city[i] = Max;
}
while (M--)
{
int A = 0;
int B = 0;
int C = 0;
cin >> A >> B >> C;
vec.push_back({ A, B, C });
}
city[1] = 0;
for (int i = 1; i <= N - 1; ++i)
{
for (int j = 0; j < vec.size(); ++j)
{
int start = get<0>(vec[j]);
int end = get<1>(vec[j]);
long long cost = get<2>(vec[j]);
if (city[start] == Max)
continue;
if (city[end] > city[start] + cost)
city[end] = city[start] + cost;
}
}
for (int i = 0; i < vec.size(); ++i)
{
int start = get<0>(vec[i]);
int end = get<1>(vec[i]);
long long cost = get<2>(vec[i]);
if (city[start] == Max)
continue;
if (city[end] > city[start] + cost)
{
cout << -1 << "\n";
return 0;
}
}
for (int i = 2; i <= N; i++)
{
if (city[i] == Max)
cout << -1 << "\n";
else
cout << city[i] << "\n";
}
return 0;
}
값에 음수값이 들어가기 때문에 벨만포드 알고리즘을 사용해야 합니다.
N-1번 째를 돌렸을 때 음수사이클이 돌아가는지 확인이 가능하기 때문에 정점의 수 - 1 만큼 회전시킵니다.
마지막으로 확인했을 때 또 줄어든다면 음수사이클이 돌아가기 때문에 -1로 표시합니다
그렇지 않다면 현재 도착하는 수를 표시합니다.
'오늘의 알고리즘' 카테고리의 다른 글
[C++] 백준 9370 미확인도착지 (0) | 2023.05.03 |
---|---|
[C++] 백준 1956 운동 (0) | 2023.05.02 |
[C++] 백준 3015 오아시스 재결합 (0) | 2023.04.25 |
[C++] 백준 17299 오등큰 (1) | 2023.04.23 |
[C++] 백준 17298 오큰수 (0) | 2023.04.21 |