模板一:
时间复杂度O(n2)
1 int dijkstra(int s,int m) //s为起点,m为终点 2 { 3 memset(dist,0,sizeof(dist)); //初始化,dist数组用来储存s到各个点的距离 4 memset(v,0,sizeof(v)); //初始化v数组,是否已标记 5 for(int i=1;i<=n;++i) //++i返回的是引用,稍微快一点 6 { 7 dist[i]=e[s][i]; //初始化,e[s][i]数组表示是点s到点i的权值,数组e用来存有向图或无向图的权值,用INF初始化 8 } 9 for(int i=1;i<=n;++i) 10 { 11 k=INF,u=0; 12 for(int j=1;j<=n;++j) //找出当前dist最小的点 13 { 14 if(!v[j]&&dist[j]<k) 15 { 16 k=dist[j]; 17 u=j; 18 } 19 } 20 v[u]=1; //标记 21 for(int j=1;j<=n;++j) //更新与点u相连的点的权值和 22 { 23 if(!v[j]&&e[u][j]<INF&&dist[u]+e[u][j]<dist[j]) //比较从点s到点u载到点j的权值和点s直接到点j的权值 24 { 25 dist[j]=dist[u]+e[u][j]; 26 } 27 } 28 } 29 return dist[m]; 30 }
模板二:
时间复杂度 O(mlogn)m为边数,n为顶点数。
对于稀疏图的效果显著,对稠密图慎用。
1 const int maxn=100005; 2 struct Edge 3 { 4 int from,to,dist; 5 Edge(int u,int v,int d):from(u),to(v),dist(d){} 6 }; 7 struct HeapNode 8 { 9 int d,u; 10 bool operator < (const HeapNode& rhs) const { 11 return d>rhs.d; 12 } 13 }; 14 struct Dijkstra 15 { 16 int n,m; 17 vector<Edge> edges; 18 vector<int> G[maxn]; //maxn要大于顶点数 19 bool done[maxn]; 20 int d[maxn]; 21 int p[maxn]; 22 23 void init(int n) 24 { 25 this->n=n; 26 for(int i=0;i<n;++i) 27 G[i].clear(); 28 edges.clear(); 29 } 30 31 void addEdge(int from,int to,int dist) 32 { 33 edges.push_back(Edge(from,to,dist)); 34 m=edges.size(); 35 G[from].push_back(m-1); 36 } 37 38 void dijkstra(int s) 39 { 40 priority_queue<HeapNode> Q; 41 for(int i=0;i<n;++i) 42 d[i]=INF; 43 d[s]=0; 44 memset(done,0,sizeof(done)); 45 Q.push((HeapNode){0,s}); 46 while(!Q.empty()) 47 { 48 HeapNode x=Q.top(); 49 Q.pop(); 50 int u=x.u; 51 if(done[u]) 52 { 53 continue; 54 } 55 done[u]=true; 56 for(int i=0;i<G[u].size();++i) 57 { 58 Edge& e=edges[G[u][i]]; 59 if(d[u]+e.dist<d[e.to]) 60 { 61 d[e.to]=d[u]+e.dist; 62 p[e.to]=G[u][i]; 63 Q.push((HeapNode){d[e.to],e.to}); 64 } 65 } 66 } 67 } 68 69 };
在c++和gcc环境下提交会报错,g++不会,持续更新……