-
[1219] 오민식의 고민BOJ 2022. 2. 6. 21:21
https://www.acmicpc.net/problem/1219
1219번: 오민식의 고민
첫째 줄에 도착 도시에 도착할 때, 가지고 있는 돈의 액수의 최댓값을 출력한다. 만약 오민식이 도착 도시에 도착하는 것이 불가능할 때는 "gg"를 출력한다. 그리고, 오민식이 도착 도시에 도착
www.acmicpc.net
<문제>
간선의 가중치의 의미를 잘 생각해보면, 교통수단의 가격이 해당 도시에서 벌 수 있는 돈보다 더 적은 경우에는
음수간선이 만들어지게 되므로 벨만포드를 사용해야만 한다.
"gg"를 출력해야하는 조건은 간단하다. 벨만포드를 돌린 이후에 dst[e]가 INF인지를 확인해도 되며,
단순히 dfs나 bfs를 돌려도 된다.
"Gee"의 조건은 더 생각해봐야 할 것이 있는데, 음수 사이클이 존재함은 물론, 음수 사이클이 발생하였을때
(해당 사이클의 노드)에서 (도착 도시)까지 갈 수 있는지를 한번 더 체크해주면 된다.
사실 벨만포드에 dfs/bfs를 더한것 뿐이고, V<=50이라 시간이나 메모리도 상당히 넉넉한데,
"Gee"를 출력해야 하는 조건을 놓치기 쉬운 문제였다.
<소스코드>
#include <bits/stdc++.h>using namespace std;using ll = long long;using pi = pair<ll, ll>;const ll INF = (ll)-1e13;
ll n, s, e, m, ans, dst[55], a[55];vector<pi> adj[55];queue<int> q;bool vst[55], cycleFlag = false;bool f(void) {while (!q.empty()) {int cur = q.front();q.pop();for (auto nxt : adj[cur]) {if (vst[nxt.first] == false) {vst[nxt.first] = true;q.push(nxt.first);}}}return vst[e] == true;}int main(void) {ios_base::sync_with_stdio(0);cin.tie(0);cin >> n >> s >> e >> m;ll i, j;for (i = 0; i < m; i++) {ll A, B, C;cin >> A >> B >> C;adj[A].push_back({B, C});}for (i = 0; i < n; i++) cin >> a[i];fill(&dst[0], &dst[53], INF);dst[s] = a[s];for (i = 0; i < n; i++) {for (j = 0; j < n; j++) {if (dst[j] == INF) continue;for (auto& x : adj[j]) {ll nIdx = x.first;ll nCost = dst[j] + a[nIdx] - x.second;if (dst[nIdx] < nCost) {dst[nIdx] = nCost;if (i == n - 1) {cycleFlag = true;vst[j] = true;q.push(j);}}}}}if (dst[e] == INF) {cout << "gg";return 0;}if (cycleFlag == true && f()) {cout << "Gee";return 0;}cout << dst[e];return 0;}'BOJ' 카테고리의 다른 글
[1175] 배달 (0) 2022.02.07 [11657] 타임머신 (0) 2022.02.06 [16956] 늑대와 양 (0) 2022.02.05 [11403] 경로 찾기 (0) 2022.02.05 [11265] 끝나지 않는 파티 (0) 2022.02.05