티스토리 뷰

PS

[백준] 11657번 타임머신 C++

Eastplanet 2022. 5. 10. 13:09

문제 출처: 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번에서 출발하여 2,3,...,N번 까지 최단거리를 구하고 문제에서 무한이 오래전으로 돌릴수 있다면 ~이라는 조건이 있으므로 음수 사이클이 존재하는지 확인하여 출력한다.

추가적으로 도시의 개수가 500개, 노선의 개수가 6000개 간선의 가중치가 -10000 ~ 10000이므로 음의 사이클이 존재하지 않는다면 최대 가중치는 500 * 10000이지만 음의 사이클이 존재한다면 -21억을 넘을수 있기 때문에 long long 자료형으로 사용해야 한다.

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>

using namespace std;
typedef pair<int, int>P;

long long INF = 123456789123;
int N, M;
vector<P> adj[501];
long long dist[501];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> N >> M;
	fill(dist, dist + 501, INF);

	for (int j = 0; j < M; j++) {
		int A, B, d;
		cin >> A >> B >> d;
		adj[A].push_back(P(B, d));
	}

	dist[1] = 0;
	int minusCircle = 0;
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			for (P p : adj[j]) {
				int next = p.first;
				int d = p.second;
				if (dist[j] != INF && dist[next] > dist[j] + d) {
					dist[next] = dist[j] + d;
					if (i == N)minusCircle = 1;
				}
			}
		}
	}


	if (minusCircle == 1) {
		cout << -1;
	}
	else {
		for (int i = 2; i <= N; i++) {
			if (dist[i] == INF)cout << -1<<'\n';
			else cout << dist[i]<<'\n';
		}
	}
	
	


}

 

'PS' 카테고리의 다른 글

[백준] 11779번 최소비용 구하기 2 C++  (1) 2022.05.10
[백준] 1738번 골목길 C++  (0) 2022.05.10
[백준] 4196 친구 네트워크  (0) 2022.04.27
[백준] 16562번 친구비  (0) 2022.04.27
[백준] 1976번 여행 가자  (0) 2022.04.27
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함