Cod sursa(job #2210080)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 5 iunie 2018 16:26:32
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <deque>
#include <vector>
#define INF 99999999

using namespace std;

ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");

int N,M;

struct Nod
{
  vector <int> Ad;
  vector <int> Cost;
};

Nod Graf[50002];

int dist[50002];
int count_q[50002];
bool in_q[50002];
bool ciclu;

void Read()
{
  fin>>N>>M;

  int a,b,d;

  for(int i=1; i<=M; ++i)
  {
    fin>>a>>b>>d;

    Graf[a].Ad.push_back(b);
    Graf[a].Cost.push_back(d);

   // Graf[b].Ad.push_back(a);
   // Graf[b].Cost.push_back(d);
  }

  fin.close();
}

void Do()
{
  for(int i=2; i<=N; ++i)
    dist[i]=INF;

  deque <int> Q;
  int nod_curent;
  int w,c;

  Q.push_back(1);

  while( !Q.empty() && !ciclu )
   {
     nod_curent=Q.front();
     Q.pop_front();

     in_q[nod_curent]=0;

     for(int i=0; i<Graf[nod_curent].Ad.size(); ++i)
     {
       w=Graf[nod_curent].Ad[i];
       c=Graf[nod_curent].Cost[i];

       if(dist[w] > dist[nod_curent] + c)
       {
         dist[w] = dist[nod_curent] + c;

         if( !in_q[w] )
           if(count_q[w]>N) { ciclu=1; break; }
           else
           {
             in_q[w]=1;
             ++count_q[w];
             Q.push_back(w);
           }
       }
     }
   }
}

void Print()
{
  if(ciclu) fout<<"Ciclu negativ!"<<'\n';
  else
  { for(int i=2; i<=N; ++i)
     fout<<dist[i]<<' ';

    fout<<'\n';
  }

  fout.close();
}

int main()
{
    Read();
    Do();
    Print();

    return 0;
}