백준 11657번: 타임머신
10688 단어 psBellman FordcppBellman Ford
타임머신
아이디어
음의 간선이 존재하기 때문에 다익스트라 알고리즘으로는 최단거리를 찾을 수 없다. 따라서 O(VE)로 모든 경우의 수를 탐색하는 벨만 포드 알고리즘이 적합.
코드
#include <bits/stdc++.h>
using namespace std;
constexpr int MAX = 501;
constexpr long long INF = 1e18;
int N, M;
vector<pair<int, long long>> adj[MAX];
long long dist[MAX];
void solve() {
fill(dist, dist+MAX, INF);
dist[1] = 0;
bool sw = false;
for (int i = 0; i < N; i++) {
for (int j = 1; j < N+1; j++) {
for (auto p : adj[j]) {
int next = p.first;
long long nc = p.second;
// dist[j] == INF, dist[next] == INF, nc < 0 인 경우 갱신이 되지 않도록 dist[j] != INF일 때만 갱신
if (dist[j] != INF && dist[next] > dist[j]+nc) {
dist[next] = dist[j]+nc;
if (i == N-1) sw = true;
}
}
}
}
if (sw) {
cout << -1 << '\n';
}
else {
for (int i = 2; i < N+1; i++) {
if (dist[i] == INF) cout << -1 << '\n';
else cout << dist[i] << '\n';
}
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M;
for (int i = 0; i < M; i++) {
int a, b, c;
cin >> a >> b >> c;
adj[a].push_back({b, c});
}
solve();
return 0;
}
여담
i가 1씩 커질때마다 싸이클을 한번씩 돈다고 하면, 500바퀴 돌렸을 때 INT_MIN보다 값이 작아질 수 있다. long long으로 써야함.
Author And Source
이 문제에 관하여(백준 11657번: 타임머신), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ks1ksi/백준-11657번-타임머신저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)