March 15, 2021 ( last updated : March 15, 2021 )
벨만포드
알고리즘
algorithm
https://github.com/sneakstarberry/
[백준] 1219번 오민식의 고민
벨만 포드 알고리즘 문제 중 하나입니다. 벨만 포드는 그래프 탐색 알고리즘 중 하나로 각 노드에 대한 최적의 비용을 할 수 있습니다.
다익스트라 알고리즘이 이와 비슷한데 벨만 포드 알고리즘은 다익스트라 알고리즘과 다른 점은 비용이 한 없이 낮아져 음의 무한대로 도달 할 때 해당 노드를 알 수 있다는 점입니다.
해당 문제는 대체적으로 일반적인 벨만 포드 알고리즘을 따르지만 주의해야 할 점은 문제의 모든 결과 값은 시작 노드에서 도착 노드까지 도착했을 경우를 상정하고 있습니다. 따라서 해당 조건에 유의하면서 코드를 짜야하며 하단의 코드에는 bfs
라는 함수가 해당 조건을 처리하는 역할을 하고 있습니다.
input = 입력 값을 받아주는 함수
bf = 벨만포드
bfs = 도착 가능한지 조건을 확인하는 함수로 bfs를 이용하여 구현
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
#define INF 1LL << 60
#define MAX 101
using namespace std;
typedef struct Edge {
int from;
int to;
long long cost;
} Edge;
int N, S, E, M;
vector<Edge> VEC;
long long DIST[MAX], EARN[MAX];
int is_visited[MAX];
void input();
void bf();
int bfs(int start);
int main() {
input();
bfs(S);
DIST[S] = -EARN[S];
bf();
if (DIST[E] != INF)
cout << -DIST[E];
return 0;
}
void input() {
cin >> N >> S >> E >> M;
for (int i = 0; i < M; i++) {
Edge edge;
cin >> edge.from >> edge.to >> edge.cost;
VEC.push_back(edge);
}
for (int i = 0; i < N; i++) {
DIST[i] = INF;
cin >> EARN[i];
}
}
void bf() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
int from = VEC[j].from;
int to = VEC[j].to;
long long cost = VEC[j].cost;
if (DIST[from] == INF) {
continue;
}
if (DIST[to] > DIST[from] + (cost - EARN[to])) {
DIST[to] = DIST[from] + (cost - EARN[to]);
if (i == (N - 1) && bfs(to)) {
cout << "Gee";
exit(0);
}
}
}
}
}
int bfs(int start) {
memset(is_visited, 0, sizeof(is_visited));
int flag = 0;
queue<int> q;
q.push(start);
is_visited[start] = 1;
while (!q.empty()) {
int node = q.front();
q.pop();
for (int i = 0; i < M; i++) {
if (VEC[i].from != node)
continue;
if (!is_visited[VEC[i].to]) {
is_visited[VEC[i].to] = 1;
q.push(VEC[i].to);
}
}
}
if (!is_visited[E]) {
flag = 1;
if (start == S) {
cout << "gg";
exit(0);
}
}
if (flag) {
return 0;
}
return 1;
}
Originally published March 15, 2021
Latest update March 15, 2021
Related posts :