Cod sursa(job #2260396)

Utilizator alex.cojocaruAlex Cojocaru alex.cojocaru Data 14 octombrie 2018 22:07:58
Problema Algoritmul Bellman-Ford Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <stdio.h>
#include <queue>
#include <vector>

#define NMAX 50001
#define INFINIT 1001

struct ind {
  int nod ;
  int cost ;
};

using namespace std;

queue <ind> q ;
vector <ind> mat [ NMAX + 1 ] ;
int dist [ NMAX + 1 ] ;

void bellmanford (int s, int n ) {
  q.push({1, 0}) ;
  dist[1] = 0 ;
  for (int i = 2 ; i <= n ; i++ ) {
    q.push ({i, INFINIT}) ;
    dist[i] = INFINIT ;
  }
  while (!q.empty()) {
    ind first = q.front() ;
    q.pop() ;
    for (ind elem : mat[first.nod] ) {
      if (dist[first.nod] + elem.cost < dist[elem.nod] ) {
        dist[elem.nod] = dist[first.nod] + elem.cost ;
        q.push({first.nod, dist[elem.nod]}) ;
      }
    }
  }
}

int main() {

  FILE *fin, *fout ;
  fin = fopen ("bellmanford.in", "r" ) ;
  fout = fopen ("bellmanford.out", "w" ) ;
  int n, a, b, c, m, ok, i ;
  fscanf (fin, "%d%d", &n, &m ) ;
  for (i = 0 ; i < m ; i++ ) {
    fscanf (fin, "%d%d%d", &a, &b, &c ) ;
    mat[a].push_back({b, c}) ;
  }
  bellmanford(1, n) ;
  ok = 0 ;
  for (i = 1 ; i <= n ; i++ ) {
    for (ind elem : mat[i] )
      if (dist[elem.nod] > elem.cost + dist[i] )
        ok = 1 ;
  }
  if (ok == 1 )
    fprintf (fout, "Ciclu negativ!" ) ;
  else
    for (i = 2 ; i <= n ; i++ )
      fprintf (fout, "%d ", dist[i] ) ;
  return 0;
}