SPFA具体原理与实现过程不再赘述,可参考其他博文
本文章主要给出可通过测试用例的代码
代码通过vector替代原始实现的邻接表将代码进行简化
题目链接:算法训练 最短路
#include<bits/stdc++.h>
using namespace std;
//大小为限定大小加一(因为不使用0号元素)
int vis[20001];
vector<int> d(20001, INT_MAX);
//多维vector后的尖括号要> > >
/*
mp可看作邻接表
一维是顶点标号
二维存储某顶点的邻接顶点,每一个元素用pair存储,包含邻接的顶点和到达该顶点的权重
*/
vector<vector<pair<int, int> > > mp(20001);
void SPFA(int s)
{
d[s] = 0; vis[s] = 1;
queue<int> q;
q.push(s);
//松弛过程
while (!q.empty()) {
int u = q.front();
q.pop();
vis[u] = 0;
for (int i = 0; i < mp[u].size(); ++i) {
int v = mp[u][i].first;
int w = mp[u][i].second;
if (d[v] > d[u] + w) {
d[v] = d[u] + w;
if (!vis[v]) {
vis[v] = 1;
q.push(v);
}
}
}
}
}
int main() {
int n, m;
cin >> n >> m;
//构造mp
for (int i = 0; i < m; ++i) {
int u, v, w;
cin >> u >> v >> w;
pair<int, int> vw;
vw.first = v;
vw.second = w;
mp[u].push_back(vw);
}
SPFA(1);
for (int i = 1; i < n; ++i)
cout << d[i + 1] << endl;
return 0;
}