Dijkstra && STL堆+Dijkstra 模版

朴素Dijkstra : O(V^2)

void Dijkstra(int s,int n)            // s为起点 s-t是所有点的集合

{ for (int i=0;i<n;i++) dist[i]=INT_MAX;        //limits.h

    memset(vis,0,sizeof(vis));      //string.h

 dist[s]=0; int ok=1; while(ok) { ok=0; int min=INT_MAX; int k; for (int i=0;i<n;i++) if ((!vis[i])&&(dist[i]<min)) { min=dist[i]; k=i; ok=1; } vis[k]=1; for (int i=0;i<n;i++) if (!vis[i]) { if (dist[i]>dist[k]+d[k][i]) { dist[i]=dist[k]+d[k][i]; } } } }

 

STL堆+Dijkstra: O(ElogV)

priority_queue <pair<int ,int>,vector<pair<int ,int> >,greater<pair<int,int> > > PQ; void Dijkstra(int s,int n) { for (int i=0;i<n;i++) dist[i]=INT_MAX;        //limits.h

    memset(vis,0,sizeof(vis));      //string.h

 dist[s]=0; while(!PQ.empty()) PQ.pop(); PQ.push(make_pair(dist[s],s)); while(!PQ.empty()) { int k=PQ.top().second; PQ.pop(); if (!vis[k]) { vis[k]=1; for (int i=0;i<n;i++) if (!vis[i]) { if (dist[i]>dist[k]+d[i][k]) { dist[i]=dist[k]+d[i][k]; PQ.push(make_pair(dist[i],i)); } } } } }

你可能感兴趣的:(dijkstra)