【模板】裸SPFA

SPFA可以处理带负边权的图,可以判负环,然而SPFA容易被卡,即使加了各种优化。

队列优化的贝尔福德曼:裸SPFA

//SPFA
#include<bits/stdc++.h>
using namespace std;
int head[1000005],d[1000005],l,n,m,s;
bool sign[1000005];
queue<int> q;
struct node {
	int to,next,val;
} a[1000005];
void add(int from,int to,int v) {
	a[++l].to=to;
	a[l].val=v;
	a[l].next=head[from];
	head[from]=l;
}
void spfa() {
	for(register int i=1; i<=n; i++)
		d[i]=12345678;
	d[s]=0;
	sign[s]=1;
	q.push(s);
	while(q.size()) {
		int x=q.front();
		q.pop();
		sign[x]=0;
		for(register int i=head[x]; i; i=a[i].next) {
			int cs=a[i].to,hl=a[i].val;
			if(d[cs]>d[x]+hl) {
				d[cs]=d[x]+hl;
				if(!sign[cs]) {
					sign[cs]=1;
					q.push(cs);
				}
			}
		}
	}
}
int main() {
	scanf("%d%d%d",&n,&m,&s);
	for(register int i=1; i<=m; i++) {
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
	}
	spfa();
	for(register int i=1; i<=n; i++)
		if(i==s)cout<<0<<' ';
		else printf("%d ",d[i]);
	return 0;
}
原文地址:https://www.cnblogs.com/yige2019/p/11743816.html