迪杰斯特拉模板

时间:2019-01-18
本文章向大家介绍迪杰斯特拉模板,主要包括迪杰斯特拉模板使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
//鍫嗕紭鍖栵紝鏃堕棿澶嶆潅搴*logn
const int MAXN = "Edit";
const int INF = 0x3f3f3f3f;
struct Edge
{
    int from, to, dist;
    Edge() {}
    Edge(int u, int v, int w) : from(u), to(v), dist(w) {}
};
struct Dijkstra
{
    int n, m;            // 鐐规暟鍜岃竟鏁?
    vector<Edge> edges;  // 杈瑰垪琛?
    vector<int> G[MAXN]; // 姣忎釜鑺傜偣鍑哄彂鐨勮竟缂栧彿锛堜粠0寮€濮嬬紪鍙凤級
    bool done[MAXN];     // 鏄惁宸叉案涔呮爣鍙?
    int d[MAXN];         // s鍒板悇鐐圭殑璺濈
    int p[MAXN];         // p[i]琛ㄧず鏈€鐭矾寰勬爲涓埌杈緄鐐圭殑杈圭殑缂栧彿

    void init(int n)
    {
        this->n = n, m = 0;
        edges.clear();                            // 娓呯┖杈硅〃
        for (int i = 0; i <= n; i++) G[i].clear(); // 娓呯┖閭绘帴琛?
    }

    void AddEdge(int from, int to, int dist)
    { // 濡傛灉鏄棤鍚戝浘锛屾瘡鏉℃棤鍚戣竟闇€璋冪敤涓ゆAddEdge
        edges.emplace_back(from, to, dist);
        m = edges.size();
        G[from].push_back(m - 1);
    }

    struct HeapNode
    {
        int from, dist;
        HeapNode (int u, int d) : from(u), dist(d) {}
        bool operator < (const HeapNode& rhs) const
        {
            return dist > rhs.dist;
        }
    };

    void dijkstra(int s)
    {
        priority_queue<HeapNode> Q;
        for (int i = 0; i <= n; i++) d[i] = INF;
        d[s] = 0;
        memset(done, 0, sizeof(done));
        Q.push(HeapNode(s, 0));
        while (!Q.empty())
        {
            HeapNode x = Q.top(); Q.pop();
            int u = x.from;
            if (done[u]) continue;
            done[u] = true;
            for (auto& id : G[u])
            {
                Edge& e = edges[id];
                if (d[e.to] > d[u] + e.dist)
                {
                    d[e.to] = d[u] + e.dist;
                    p[e.to] = id;
                    Q.push(HeapNode(e.to, d[e.to]));
                }
            }
        }
    }

}gao;



//dijkstra,鏃堕棿澶嶆潅搴^2
const int MAXN = "Edit";
const int INF = 0x3f3f3f3f;
struct Edge
{
    int from, to, dist;
    Edge() {}
    Edge(int u, int v, int w) : from(u), to(v), dist(w) {}
};
struct Dijkstra
{
    int n, m;            // 鐐规暟鍜岃竟鏁?
    vector<Edge> edges;  // 杈瑰垪琛?
    vector<int> G[MAXN]; // 姣忎釜鑺傜偣鍑哄彂鐨勮竟缂栧彿锛堜粠0寮€濮嬬紪鍙凤級
    bool done[MAXN];     // 鏄惁宸叉案涔呮爣鍙?
    int d[MAXN];         // s鍒板悇鐐圭殑璺濈
    int p[MAXN];         // p[i]琛ㄧず鏈€鐭矾寰勬爲涓埌杈緄鐐圭殑杈圭殑缂栧彿

    void init(int n)
    {
        this->n = n, m = 0;
        edges.clear();                            // 娓呯┖杈硅〃
        for (int i = 0; i <= n; i++) G[i].clear(); // 娓呯┖閭绘帴琛?
    }

    void AddEdge(int from, int to, int dist)
    { // 濡傛灉鏄棤鍚戝浘锛屾瘡鏉℃棤鍚戣竟闇€璋冪敤涓ゆAddEdge
        edges.emplace_back(from, to, dist);
        m = edges.size();
        G[from].push_back(m - 1);
    }

    void dijkstra(int s)
    { // 娉ㄦ剰姝ょ鍐欐硶缂栧彿浠?寮€濮?
        for (int i = 0; i <= n; i++) d[i] = INF;
        d[s] = 0;
        memset(done, 0, sizeof(done));
        for (int i = 0; i < n; i++)
        {
            int pos, MIN = INF;
            for (int j = 0; j < n; j++)
            {
                if(!done[j] && d[j] < MIN) MIN = d[pos = j];
            }
            done[pos] = true;
            for (auto id : G[pos])
            {
                Edge& e = edges[id];
                if (d[e.to] > d[pos] + e.dist)
                {
                    d[e.to] = d[pos] + e.dist;
                    p[e.to] = id;
                }
            }
        }
    }

}gao;

解释转码码有问题望见谅参考刘汝佳蓝书