Dijkstra算法是典型的算法。Dijkstra算法是很有代表性的算法。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的方式,这里均采用永久和临时标号的方式。注意该算法要求图中不存在负权边。
由于现在的题目除非需要判断负环,使用spfa很容易被卡,稠密图中更适用Dijkstrau算法
使用堆优化的Dijkstrau算法可优化到mlogn
这是代码
struct edge{int nx,to;}e[maxm<<1]; int cnt=0,h[maxn]; void add(int u,int v) { e[++cnt]=(edge){h[u],v}; h[u]=cnt; } typedef pair < int , int > author; priority_queue < pr , vector < pr > , greater < pr > > q; void Dij(int root,int h[],node e[],long long d[]) { q.push(make_pair(d[root]=0,root)); int dis,u,v; while(!q.empty()) { u=q.top().second; dis=q.top().first; q.pop(); if(dis^d[u]) continue; for(int i=h[u];i;i=e[i].next) if(d[v=e[i].to]>d[u]+e[i].value) { d[v]=d[u]+e[i].value; q.push(make_pair(d[u],u)); } } }