最短路算法之SPFA算法

SPFA(Shortest Path Faster Algorithm)算法自然有它的过人之处,它是BELLMAN-FORD算法的一种优化版本,一般认为算法复杂度为O(E)就好了 (其实我也不知道是O几)。

算法思想就是把源点加入队列,然后从队列里不断取出队首,用队首相关的边去松弛,若能松弛,则把被松弛的边的另一个端点加入队列(若已经在队列里就不用加了),如此反复知道队列为空。

vector<int>g[N], e[N];
queue<int>q;
bool in[N];
int dis[N];

void add(int u, int v, int c){
	g[u].push_back(v);
	e[u].push_back(c);
}

int spfa(int s, int t){
	memset(in, false, sizeof in);
	memset(dis, 0x3f, sizeof dis);
	q.push(s);
	in[s] = true;
	dis[s] = 0;

	while (!q.empty()){
		int u = q.front(); q.pop();
		//记得消去in标志
		in[u] = false;

		for (int i = 0; i < g[u].size(); i++){
			int v = g[u][i], c = e[u][i];

			if (dis[v]>dis[u] + c){
				dis[v] = dis[u] + c;
				if (!in[v]){
					q.push(v);
					//记得带上in标志
					in[v] = true;
				}
			}
		}

	}
	return dis[t];
}


你可能感兴趣的:(最短路算法之SPFA算法)