본문 바로가기

알고리즘/백준

백준 11657

 

/* 타임머신 */

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

#define INF 2100000000
#define ll long long int
#define pp pair<ll,ll>

using namespace std;

void input();
void solve();

struct line {
	int src, dst, wgt;
	line(int a, int b, int c) {
		src = a; dst = b; wgt = c;
	}
};

int N, M;
ll dist[501];
vector<line> edge;

int main(void) {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	input();
	solve();
	return 0;
}

void input() {
	cin >> N >> M;

	for (int i = 0; i < M; i++) {
		int a, b, c; cin >> a >> b >> c;
		edge.push_back(line(a, b, c));
	}
}

bool bellman_ford(int src) {
	fill(dist, dist + 501, INF);
	dist[src] = 0;

	for (int i = 1; i < N; i++) {
		for (auto node : edge) {
			if (dist[node.src] != INF && dist[node.dst] > dist[node.src] + node.wgt) {
				dist[node.dst] = dist[node.src] + node.wgt;
			}
		}
	}

	for (auto node : edge) {
		if (dist[node.src] != INF && dist[node.dst] > dist[node.src] + node.wgt) {
			return true;
		}
	}
	return false;
}

void solve() {
	if (bellman_ford(1) == true) {
		cout << "-1\n";
		return;
	}
	for (int i = 2; i <= N; i++) {
		dist[i] = (dist[i] == INF ? -1 : dist[i]);
		cout << dist[i] << '\n';
	}
	return;
}

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

 

벨만 포드 알고리즘을 있는 그대로 적용하는 문제다.

 

별다르게 어려울 건 없다. 

 

시간복잡도만 좀 작았으면 벨만포드도 참 매력적인 알고리즘일텐데...

 

 

'알고리즘 > 백준' 카테고리의 다른 글

백준 1275 커피숍2  (0) 2020.08.31
백준 2610 회의준비  (0) 2020.08.30
백준 1865 웜홀  (0) 2020.08.30
백준 14725 개미굴  (0) 2020.08.30
백준 10165 버스 노선  (0) 2020.08.30