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;
}
任意の頂点から始まると仮定します.
この頂点で最小の幹線料金を見つけて、その頂点に移動するとき、値がもっと小さいなら、行きます.
  • ベクトルdist:この頂点に到達時の総コストは
  • と記録される.
  • ベクトル図:方向図
  • 優先順位queuepq:最小の幹線コストを探すための優先順位キュー
  • if(dist[next]>next dis sum):この頂点にアクセスするのは、合計費用の値が小さくなった場合のみです.
    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

  • 複数のカーブアルゴリズムを使用する場合の特徴

  • が負数に重み付けされている場合は使用できません.(値の再割り当てが継続されるため、無限ループは回避されます.)
  • マルチエストラアルゴリズムはベルマンフォードアルゴリズムよりも使用時間が速い.