Untitled

 avatar
unknown
c_cpp
2 months ago
1.3 kB
2
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;
}
Leave a Comment