[模板] Dijkstra单源最短路径

来源:互联网 发布:thumbdata怎么删除知乎 编辑:程序博客网 时间:2024/05/17 23:09

十分基础的Dijkstra算法

详见代码

#define maxn 100000#define maxm 100000using namespace std;const int INF=999999999;struct HeapNode{int d,u;bool operator < (const HeapNode& rhs) const{return d>rhs.d;}};struct Edge{int from,to,dist;Edge(int u,int v,int d):from(u),to(v),dist(d) {}};struct Dijkstra{int n,m;vector<Edge> edges;vector<int> G[maxn];bool done[maxn];//是否用过(永久标号) int d[maxn];//s到各个点的距离 (dist) int p[maxn];//最短路上的一条边 (path) void init(int n){this->n=n;for(int i=0;i<n;i++){G[i].clear(); }edges.clear();} void AddEdge(int from,int to,int dist){edges.push_back(Edge(from,to,dist));m=edges.size();G[from].push_back(m-1);}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){0,s});while(!Q.empty()){HeapNode x=Q.top();Q.pop();int u=x.u;if(done[n]){continue;}done[u]=true;for(int i=0;i<G[u].size();i++){Edge& e=edges[G[u][i]];if(d[e.to]>d[u]+e.dist){d[e.to]=d[u]+e.dist;p[e.to]=G[u][i];Q.push((HeapNode){d[e.to],e.to});}}}}};


原创粉丝点击