728x90
반응형
11657번: 타임머신
문제
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
풀이
그래프에서 1번 정점으로부터 각 정점으로의 최단 거리를 구하는 문제다. 가중치가 음수도 가능하므로 기본적인 벨만-포드 알고리즘으로 풀 수 있는 문제. 만약 무한정 작아질 수 있는 루프가 있으면 -1을 출력하면 된다.
코드
#include <bits/stdc++.h>
using namespace std;
#define INF 1e18
int N, M;
vector<pair<int, int>> graph[501];
vector<long long> dist(501, INF);
bool minusCycle = false;
void bellman_ford(int s) {
dist[s] = 0;
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
for (auto &p : graph[j]) {
int next = p.first, d = p.second;
if (dist[j] != INF && dist[next] > dist[j] + d) {
dist[next] = dist[j] + d;
if (i == N)
minusCycle = true;
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> N >> M;
while (M--) {
int a, b, c;
cin >> a >> b >> c;
graph[a].push_back({b, c});
}
bellman_ford(1);
if (minusCycle)
cout << "-1\n";
else
for (int i = 2; i <= N; i++)
cout << (dist[i] != INF ? dist[i] : -1) << '\n';
return 0;
}
728x90
반응형
'Problem Solving > BOJ' 카테고리의 다른 글
[백준 / BOJ] C++ 1697 숨바꼭질 (0) | 2023.02.23 |
---|---|
[백준 / BOJ] C++ 1865 웜홀 (0) | 2023.02.22 |
[백준 / BOJ] C++ 1016 제곱 ㄴㄴ 수 (0) | 2023.02.21 |
[백준 / BOJ] C++ 9694 무엇을 아느냐가 아니라 누구를 아느냐가 문제다 (1) | 2023.02.21 |
[백준 / BOJ] C++ 2307 도로검문 (0) | 2023.02.21 |