dijkstra和spfa时间复杂度的疑惑
  • 板块学术版
  • 楼主hjqhs
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/4/27 20:49
  • 上次更新2023/10/23 17:24:23
查看原帖
dijkstra和spfa时间复杂度的疑惑
724988
hjqhs楼主2023/4/27 20:49

dijkstradijkstra朴素版时间复杂度是O(n2)O(n^2),说明松弛一个点的代价是O(n)O(n)
spfaspfa算法在极端情况下会被卡到O(nm)O(nm),其中n是进队次数,说明松弛代价是O(m)O(m)
都是松弛操作,为何时间复杂度不一样
附关键部分代码:
dijkstradijkstra:

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];
	}
}

spfaspfa:

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;
				} 
			} 
	}
}
2023/4/27 20:49
加载中...