Cod sursa(job #2592049)

Utilizator TincaMateiTinca Matei TincaMatei Data 31 martie 2020 23:47:37
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>
#include <vector>
#include <deque>

using namespace std;

const int MAX_N = 50000;
const int MAX_M = 250000;
const int INF = 1000000000;

struct Edge {
  int to, cost, freq;
};

vector<Edge> edges;
vector<vector<int> > graph;
vector<int> cost;
vector<bool> inQueue;

int main() {
  int n, m;
  int a, b, c;
  int src;
  bool infiniteCycle;

  FILE *fin = fopen("bellmanford.in", "r");
  fscanf(fin, "%d%d", &n, &m);

  graph.resize(n + 1, vector<int>());
  cost.resize(n + 1, INF);
  inQueue.resize(n + 1, false);

  for(int i = 0; i < m; ++i) {
    fscanf(fin, "%d%d%d", &a, &b, &c);
    graph[a].push_back(edges.size());
    edges.push_back({b, c, 0});
  }
  fclose(fin);

  src = 1;

  cost[1] = 0;
  deque<int> coada;
  coada.push_back(1);
  inQueue[1] = true;

  infiniteCycle = false;
  while(!coada.empty() && !infiniteCycle) {
    int nod = coada.front();
    coada.pop_front();
    inQueue[nod] = false;

    for(auto it: graph[nod]) {
      if(cost[nod] + edges[it].cost < cost[edges[it].to]) {
        cost[edges[it].to] = cost[nod] + edges[it].cost;

        if(!inQueue[edges[it].to]) {
          coada.push_back(edges[it].to);
          edges[it].freq++;
          inQueue[edges[it].to] = true;
        }

        if(edges[it].freq > n)
          infiniteCycle = true;
      }
    }
  }

  FILE *fout = fopen("bellmanford.out", "w");
  if(infiniteCycle)
    fprintf(fout, "Ciclu negativ!");
  else {
    for(int i = 2; i <= n; ++i)
      fprintf(fout, "%d ", cost[i]);
  }
  fclose(fout);

  return 0;
}