dijkstra朴素版时间复杂度是O(n2),说明松弛一个点的代价是O(n)
spfa算法在极端情况下会被卡到O(nm),其中n是进队次数,说明松弛代价是O(m)
都是松弛操作,为何时间复杂度不一样
附关键部分代码:
dijkstra:
void Dijkstra(){
for(int i=1;i<=n;i++)dis[i]=inf;
dis[s]=0;dis[0]=inf;
while(1){
int u=0;
for(int i=1;i<=n;i++)
if(!vis[i]&&dis[u]>dis[i])u=i;
if(u==0)break;
vis[u]=1;
for(int i=h[u];i;i=nxt[i])
if(dis[to[i]]>(long long)dis[u]+val[i])
dis[to[i]]=dis[u]+val[i];
}
}
spfa:
void spfa(){
for(int i=1;i<=n;i++)dis[i]=inf;
dis[s]=0;vis[s]=1;q.push(s);
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=0;
for(int i=h[u];i;i=nxt[i])
if(dis[to[i]]>(long long)dis[u]+val[i]){
dis[to[i]]=dis[u]+val[i];
if(!vis[to[i]]){
q.push(to[i]);
vis[to[i]]=1;
}
}
}
}