C++で複数の曲線アルゴリズムを使用した方向図の最小距離コスト(最小HIP優先キューを使用)
任意の頂点から、方向図内から各頂点までの最小距離コストを出力するコード。
任意の頂点は1番の頂点です.
定点数n、幹線数m.
各幹線は始点、終点、料金を入力します.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct Data { // array of array
int e, dis;
Data(int a, int b ){
e = a;
dis = b;
}
bool operator< (const Data &d) const {
return dis > d.dis;
}
};
int n, m;
vector<int> dist(21, 2147000000);
vector<Data> graph[21];
priority_queue<Data> pQ;
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[a].push_back(Data(b, c));
}
pQ.push(Data(1, 0)); // 임의의 시작점
dist[1] = 0;
while(!pQ.empty()) {
Data data = pQ.top();
int now = data.e;
int dis_sum = data.dis;
pQ.pop();
for(int i=0; i<graph[now].size(); i++) {
int next = graph[now][i].e;
int next_dis_sum = dis_sum + graph[now][i].dis;
if(dist[next] > next_dis_sum) { // relaxing
dist[next] = next_dis_sum;
pQ.push(Data(next, next_dis_sum));
}
}
}
for(int i=2; i<=n; i++) {
if(dist[i] != 2147000000) cout << i << " : "
<< dist[i] << '\n';
else cout << i <<" : can not reach\n";
}
return 0;
}
任意の頂点から始まると仮定します.この頂点で最小の幹線料金を見つけて、その頂点に移動するとき、値がもっと小さいなら、行きます.
ex)
6 9
1 2 12
1 3 4
2 1 2
2 3 5
2 5 5
3 4 5
4 2 2
4 5 5
6 4 5
複数のカーブアルゴリズムを使用する場合の特徴
Reference
この問題について(C++で複数の曲線アルゴリズムを使用した方向図の最小距離コスト(最小HIP優先キューを使用)), 我々は、より多くの情報をここで見つけました https://velog.io/@juwon9733/다익스트라-알고리즘을-활용한-방향-그래프에서의-최소-거리비용priority-queue-사용-in-Cテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol