Untitled
unknown
c_cpp
10 months ago
1.3 kB
4
Indexable
// 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;
}Editor is loading...
Leave a Comment