Untitled
// Bellman-Ford's algorithm #include <bits/stdc++.h> using namespace std; struct Edge { int u; int v; long long w; }; void dfs(int u, vector<bool> &seen, vector<vector<int>> &adj) { seen[u] = true; for (auto v : adj[u]) { if (seen[v]) continue; dfs(v, seen, adj); } } int n, m; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m; vector<long long> dist(n + 1, LLONG_MIN); vector<vector<int>> adj(n + 1), rAdj(n + 1); vector<long long> temp(dist.begin(), dist.end()); vector<bool> seen1(n + 1), seen2(n + 1); vector<Edge> edges(m); for (int i = 0; i < m; i++) { cin >> edges[i].u >> edges[i].v >> edges[i].w; adj[edges[i].u].push_back(edges[i].v); rAdj[edges[i].v].push_back(edges[i].u); } dfs(1, seen1, adj); dfs(n, seen2, rAdj); dist[1] = 0; for (int i = 1; i <= n; i++) { temp = dist; bool update = false; for (auto[u, v, w] : edges) { if (dist[u] != LLONG_MIN && temp[v] < dist[u] + w) { temp[v] = dist[u] + w; update = true; if (i == n && seen1[v] && seen2[v]) { cout << -1 << endl; return 0; } } } dist = temp; if (!update) break; } cout << dist[n] << endl; return 0; }
Leave a Comment