dijkstra模版

#include<bits/stdc++.h>
#define REP(i,a,b) for(int i=a;i<=b;i++)
#define MS0(a) memset(a,0,sizeof(a))

using namespace std;

typedef long long ll;
const int maxn=1000100;
const int INF=1e9+10;

struct Edge
{
    int u,v,w;
};

struct Dijkstra
{
    int n,m;
    vector<Edge> edges;
    vector<int> G[maxn];
    bool done[maxn];
    int d[maxn];
    int p[maxn];
    void init(int n)
    {
        this->n=n;
        REP(i,1,n) G[i].clear();
        edges.clear();
    }
    void addedge(int u,int v,int w)
    {
        edges.push_back({u,v,w});
        m=edges.size();
        G[u].push_back(m-1);
    }
    struct HeapNode
    {
        int d,u;
        friend bool operator<(HeapNode A,HeapNode B)
        {
            return A.d>B.d;
        }
    };
    void dijkstra(int s)
    {
        priority_queue<HeapNode> q;
        REP(i,1,n) d[i]=INF;
        d[s]=0;
        MS0(done);
        q.push({0,s});
        while(!q.empty()){
            HeapNode x=q.top();q.pop();
            int u=x.u;
            if(done[u]) continue;
            done[u]=1;
            for(int i=0;i<G[u].size();i++){
                Edge &e=edges[G[u][i]];
                if(d[e.v]>d[u]+e.w){
                    d[e.v]=d[u]+e.w;
                    p[e.v]=G[u][i];
                    q.push({d[e.v],e.v});
                }
            }
        }
    }
};Dijkstra dijk;
View Code

 

posted @ 2016-02-10 20:50  __560  阅读(438)  评论(0编辑  收藏  举报