--- tags: codebook --- {%hackmd theme-dark %} # Label Correcting Algorithm(SPFA) ```cpp= #include<iostream> #include<vector> #include<queue> #include<algorithm> #define endl '\n' using namespace std; constexpr int limit = numeric_limits<int>::max(); struct LabelCorrectingAlgorithm { vector<int> d; vector<size_t> parent; vector<size_t> operator()(size_t x) { vector<size_t> v; do v.push_back(x), x = parent[x]; while (x != parent[x]); return v; } LabelCorrectingAlgorithm(const vector<vector<pair<size_t, int>>>& v, size_t source = 0): d(v.size(), numeric_limits<int>::max()), parent(v.size(), 0) { d[source] = 0; queue<size_t> q; q.push(source); vector<bool> inqueue(v.size(), false); while (!q.empty()) { auto a = q.front(); q.pop(), inqueue[a] = false; if (inqueue[parent[a]]) continue; for (const auto& i : v[a]) if (i.second != limit && d[a] != limit && d[a] + i.second < d[i.first]) { d[i.first] = d[a] + i.second; parent[i.first] = a; if (!inqueue[i.first]) q.push(i.first), inqueue[i.first] = true; } } } }; template<typename T> ostream& operator<<(ostream& os, const vector<T>& v) { for (const auto& i : v) os << i << ' '; return os; } int main() { // cin.tie(nullptr); // ios::sync_with_stdio(false); int c; size_t n, m, a, b; cin >> n >> m; vector<vector<pair<size_t, int>>> v(n + 1); for (size_t i = 0; i != m; i++) cin >> a >> b >> c, v[a].emplace_back(b, c); LabelCorrectingAlgorithm graph(v, 4); for (size_t i = 1; i != v.size(); i++) cout << i << ": " << graph(i) << endl; return 0; } ```