最短路径--SPFA算法
SPFA算法的引入
实际上,SPFA算法其实是对Bellman-Ford算法的优化,它通过队列这种数据结构,使得在松弛操作时不会去遍历无关的边。
SPFA算法的代码实现
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
typedef pair<int, int> PII;
int n, m, cnt;
int dis[105];
int vis[105];
int s;
int head[105];
int use[105];
struct edge {
int to, next, w;
}e[10005];
void add(int x, int y, int w) {
e[cnt].to = y;
e[cnt].w = w;
e[cnt].next = head[x];
head[x] = cnt;
cnt++;
}
void SPFA() {
queue<int>q;
memset(dis, 0x3f, sizeof(dis));
dis[s] = 0;
q.push(s);
use[s]++;
vis[s] = 1;//标记s是否入队
while (!q.empty()) {
int u = q.front();
q.pop();
vis[u] = 0;
for (int i = head[u]; i != -1; i = e[i].next) {
int v = e[i].to;
if (vis[v]==0&&dis[v] > dis[u] + e[i].w) {
dis[v] = dis[u] + e[i].w;
q.push(v);
vis[v] = 1;
use[v]++;//大于等于n说明存在负环
}
}
}
}
int main() {
cin >> n >> m >> s;
int x, y, w;
memset(head, -1, sizeof(head));
for (int i = 1; i <= m; i++) {
cin >> x >> y >> w;
add(x, y, w);
}
SPFA();
for (int i = 1; i <= n; i++) {
cout << dis[i] << " ";
}
return 0;
}
/*
5 5 1
2 3 2
1 2 -3
1 5 5
4 5 2
3 4 3
*/