Cod sursa(job #2424041)

Utilizator alexandradonici99@yahoo.comAlexandra Donici [email protected] Data 22 mai 2019 15:33:22
Problema Algoritmul Bellman-Ford Scor 35
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <iostream>
#include <climits>
#include <fstream>
#include <list>
#include <vector>
#include <set>

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,p;
    for(int i=0;i<m;i++)
    {
        fin>>x>>y>>p;
        L[x].push_back({p,y});
       // L[y].push_back({p,x});
    }

}

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

    }

    d[1]=0;

}


void Bellman(list <pair <int,int> > *L,int n,int m,vector <int> &t,vector <int> &d, int&ok)
{

    set <pair <int,int> > Q;
    initializare(t,d,n);
    ok=1;

    for(int i=1;i<=n;i++)
        Q.insert({d[i],i});
    vector <int > s(n+1,0);

    int nrsel=0,i;
    while(nrsel!=n)
    {
        int x;
        do
        {
            x=Q.begin()->second;
            Q.erase(Q.begin());

        }
        while(s[x]==1);
        s[x]++;
        nrsel++;
       for(i=1;i<=n-1;i++)
        for(auto pr: L[x])
            if(!s[pr.second])
        {
            int y=pr.second;
            int p=pr.first;

            if(d[y]>d[x]+p)
            {
                d[y]=d[x]+p;
                t[y]=x;
                Q.insert({d[y],y});
            }
        }
    }
for(i=1;i<=n;i++)
        for(auto pr: L[i])
        {
            int y=pr.second;
            int p=pr.first;

            if(d[i]!=inf && d[y]>d[i]+p)
            {
                ok=0;

            }
        }

if(ok==0)
    fout<<"Ciclu negativ!";
else
    for(int i=2;i<=n;i++)
    {
        fout<<d[i]<<' ';
    }



}

int main()
{
    list <pair <int,int> > *L;
    int n,m,st,ok;
    vector <int> t;
    vector <int> d;
    citire(L,n,m);

    Bellman(L,n,m,t,d,ok);
    return 0;
}