ベルマンフォードアルゴリズムを用いた方向図の最小距離コスト
方向図では、1つの頂点から別の頂点への最小コストのコードです。
定点数n、幹線数m.
最後の入力として,知りたい料金区間,すなわち出発点と到着点を与えた.
負のループが存在して答えが得られない場合は、-1が出力されます.
#include <iostream>
#include <vector>
using namespace std;
struct Data {
int s, e, val;
Data(int a, int b, int c) {
s = a;
e = b;
val = c;
}
};
int n, m, answer_s, answer_e;
int dist[101];
vector<Data> graph;
int main() {
freopen("input.txt", "rt", stdin);
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int a, b, c;
cin >> a >> b >> c;
graph.push_back(Data(a, b, c));
}
for (int i = 1; i <= n; i++) {
dist[i] = 2147000000; // 무한대로 초기화
}
cin >> answer_s >> answer_e;
dist[answer_s] = 0; // 출발 정점
for (int i = 1; i < n; i++) { // 간선 i개로 가는 경우를 말한다.
for (int j = 0; j < graph.size(); j++) {
int s = graph[j].s;
int e = graph[j].e;
int val = graph[j].val;
if (dist[s] != 2147000000 && dist[s] + val < dist[e]) {
dist[e] = dist[s] + val;
}
}
}
for (int j = 0; j < graph.size(); j++) {
int s = graph[j].s;
int e = graph[j].e;
int val = graph[j].val;
if (dist[s] != 2147000000 && dist[s] + val < dist[e]) {
cout << "-1\n";
return 0;
}
}
cout << dist[answer_e];
return 0;
}
dist[i]:起点頂点からi番目の頂点までのコストを記録する.
dist[i]=2147000:リラックスのために初期値は無限大である.
for (int i=1; i<n; i++) { for(int j=0; j<graph.size(); j++)}
:変数iに対応するfor loopは、始点から幹線iまでの到達可能な頂点を記録する.すなわち,1本の幹線からn−1本の幹線を用いた場合,すべての数を記録する.
一番下の最後のfor(intj=0;j
5 7
1 2 5
1 3 4
2 3 -3
2 5 13
3 4 5
4 2 3
4 5 7
1 5
ベルマンフォードアルゴリズムの特徴
Reference
この問題について(ベルマンフォードアルゴリズムを用いた方向図の最小距離コスト), 我々は、より多くの情報をここで見つけました https://velog.io/@juwon9733/벨만포드-알고리즘을-활용한-방향-그래프에서의-최소-거리비용テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol