ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【算法】最短路 - SPFA

2020-05-21 21:01:21  阅读:214  来源: 互联网

标签:队列 int 短路 SPFA inq ++ 算法 Ford


SPFA

即队列优化过的Bellman-Ford算法,可以处理带负权图。

应用于单源最短路。

此外还可以进行负权环的判定,即若第n次操作仍可降低花费,则一定存在负权环。

//Bellman-Ford算法
for (int i = 0; i < n; i++) d[i] = INF;
	d[0] = 0;
	for (int k = 0; k < n - 1; k++) {//迭代n-1次
		for (int i = 0; i < m; i++) {
			int x = u[i], y = v[i];
			if (d[x] < INF) d[y] = min(d[y], d[x] + w[i]);
		}
	}
//队列优化的Bellman-Ford算法(SPFA)
bool spfa(int s) {
	queue<int>Q;
	memset(inq, 0, sizeof(inq));//标记结点是否在队列中
	memset(cnt, 0, sizeof(cnt));
	for (int i = 0; i < n; i++) d[i] = INF;
	d[s] = 0;
	inq[s] = true;//标记结点s已在队列中
	Q.push(s);
	while (!Q.empty()) {
		int u = Q.front(); Q.pop();
		inq[u] = false;//标记已不在队列
		for (int i = 0; i < G[u].size(); i++) {
			Edge& e = Edges[G[u][i]];//遍历以结点u为起点的有向边
			if (d[u]<INF && d[u] + e.dist<d[e.to]) {
				d[e.to] = d[u] + e.dist;//松弛
				p[e.to] = G[u][i];//记录父节点
				if (!inq[e.to]) {//只要不在队列中就可以入队
					Q.push(e.to);
					inq[e.to] = true;
					if (++cnt[e.to] > n) return false;
					//如果某个点迭代了超过n次,说明存在可以无限缩短的最短路,即负环
				}
			}
		}
	}
	return true;
}

标签:队列,int,短路,SPFA,inq,++,算法,Ford
来源: https://www.cnblogs.com/streamazure/p/12933554.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有