SPFA算法通常用于求含负权边的单源最短路径,以及判负权环,而Dijkstra算法不能算负边
稠密图中复杂度比堆优化的Dijkstra算法差
int n,m; //n个点,m次插入
int h[N], w[N], e[N], ne[N], idx;
int dist[N]; //到这个点的最小距离
bool st[N];
void add(int a,int b,int c){ //存储邻接表
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
cin>>n>>m;
memset(h,-1,sizeof h); //头指针赋值为-1
while(m--){ //输入n个点
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
}
int spfa(){
memset(dist, 0x3f, sizeof dist); //初始值为-1
dist[1] = 0; //起点
queue<int> q;
q.push(1); //插入起点
st[1] = true; //队列中插入了
while (q.size()){ //不为空的时候
auto t = q.front(); //取第一个
q.pop(); //删除第一个
st[t] = false;
for (int i = h[t]; i != -1; i = ne[i]){ //从尾节点开始找,找到开始节点
int j = e[i];
if (dist[j] > dist[t] + w[i]){ //最小值更新
dist[j] = dist[t] + w[i];
if (!st[j]){ //如果队列中没有这个点就插入
q.push(j);
st[j] = true; //现在有了
}
}
}
}
if (dist[n] == 0x3f3f3f3f) return -1; //如果要找的值是无穷大,那就到不了
return dist[n]; //到得了的话输出这个位置的距离
}