Cod sursa(job #2424058)

Utilizator ClaudiaElena00muscalu Elena-Claudia ClaudiaElena00 Data 22 mai 2019 15:57:57
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <iostream>
#include <climits>
#include <fstream>
#include <list>
#include <vector>
#include <queue>

using namespace std;
#define inf INT_MAX/2
ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");


void citire(list <pair <int,int > > * &L, int &n, int &m)
{
    fin>>n>>m;
    L=new list<pair<int,int> >[n+1];
    int x,y,c;

    for(int i=0;i<m;i++)
     {
         fin>>x>>y>>c;
         L[x].push_back({c,y});
    }
}

void initializare(vector <int> &viz, vector <int> &d, vector<int> &esteincoada, int n)
{
    d.resize(n+1);
    viz.resize(n+1);
    esteincoada.resize(n+1);
    for(int i=1;i<=n;i++)
    {
        viz[i]=0;
        esteincoada[i]=0;
        d[i]=inf;

    }
}

bool bellmanford(int s, int n, vector <int> &viz, vector <int> &d, vector<int> &esteincoada, list <pair <int,int > > *L )
{
    queue <int> coada;

    initializare(viz,d,esteincoada,n);

    d[s] = 0;
    coada.push(s);
    esteincoada[s] = 1;

    while(!coada.empty())
    {
        int nodcurent = coada.front();

        viz[nodcurent]++;

        if(viz[nodcurent] >= n)
            return false;

        coada.pop();
        esteincoada[nodcurent] = 0;

        for(pair <int,int> pr: L[nodcurent])
        {
            int y=pr.second;
            int p=pr.first;

            if(d[y]>d[nodcurent]+p)
            {
                d[y]=d[nodcurent]+p;
                if(!esteincoada[y])
                coada.push(y);
            }
        }
    }
    return true;
}
int main()
{
    int n,m;
    vector<int> d;
    vector<int> viz;
    vector<int> esteincoada;
    list< pair< int, int> > *L;
    citire(L,n,m);
  if(bellmanford(1,n,viz,d,esteincoada,L))
    {
        for(int i=2;i<=n;i++)
            fout<<d[i]<<" ";
    }
    else
      fout<<"Ciclu negativ!";

    return 0;
}