Dijkstra最短路

//普通版本 O(n^2)
int
vis[n],d[n]; memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) d[i]=(i==0? 0:inf); for(int i=0;i<n;i++){ int x,m=inf; for(int y=0;y<n;y++){ if(!vis[y]&&d[y]<m) m=d[x=y]; } vis[x]=1; for(int y=0;y<n;y++) d[y]=min(d[y],d[x]+w[x][y]); }
//队列优化 O(Elog(N))
const
int inf=999999999; 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]; 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); } struct HeapNode{ int d,u; bool operator < (const HeapNode& rhs) const{ return d>rhs.d; } }; 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}); } } } } };

 

posted @ 2019-06-10 18:38  Hanasaki  阅读(94)  评论(0)    收藏  举报