大白-Dijksta模板

来源:互联网 发布:js清空数组中所有元素 编辑:程序博客网 时间:2024/04/26 00:12

     这个模板更加直观。


#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>#include<vector>#include<queue>#include<cmath>typedef long long ll;using namespace std;#define T 555#define maxn 123#define inf 0x3f3f3f3fstruct Edge{int from,to,dist;Edge(){}Edge(int _1,int _2,int _3):from(_1),to(_2),dist(_3){}};struct HeapNode{int d,u;HeapNode(){}HeapNode(int _1,int _2):d(_1),u(_2){}bool operator<(const HeapNode& rhs)const{return d>rhs.d;}};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;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[u])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));}}}}};



0 0
原创粉丝点击