template <typename T>
struct edge
{
    int to;
    T cost;
    edge(int t, T c) : to(t), cost(c) {}
};
#define P pair<T, int> //P.first:最短距離,P.second:頂点の番号
//頂点V個の負閉路なし重み付きグラフGにおける始点sからの最短距離を求める
template <typename T>
void dijkstra(vector<vector<edge<T>>> G, vector<T> &dist, int s)
{
    int V = G.size();
    //greater<P>によってfirstが小さい順に取り出される
    priority_queue<P, vector<P>, greater<P>> que;
    for (int i = 0; i < V; i++)
        dist[i] = numeric_limits<T>::max();
    dist[s] = (T)0;
    que.push(P((T)0, s));
    //queが空になるまで繰り返す
    while (!que.empty())
    {
        P p = que.top();
        que.pop();
        int v = p.second;
        if (dist[v] < p.first)
            continue; //すでに最短距離ならスルー
        for (int i = 0; i < G[v].size(); i++)
        {
            edge e = G[v][i];
            //更新作業
            if (dist[e.to] > dist[v] + e.cost)
            {
                dist[e.to] = dist[v] + e.cost;
                que.push(P(dist[e.to], e.to));
            }
        }
    }
}
#undef P
    
    
© 2020 kacho65535