Cod sursa(job #2424069)

Utilizator alexandradonici99@yahoo.comAlexandra Donici [email protected] Data 22 mai 2019 16:13:57
Problema Algoritmul Bellman-Ford Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 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)
{
int i;

    set <pair <int,int> > Q;
    initializare(t,d,n);
ok=1;
    Q.insert(make_pair(0,1));
    while(!Q.empty())
    {
        int u=(*Q.begin()).second;
        Q.erase(Q.begin());
        for(i=1;i<=n-1;i++)
        for(auto v:L[u])
        {
           int y=v.second;
            int p=v.first;
            if(d[y]>d[u]+p)
            {
                Q.erase(make_pair(d[y],y));
                d[y]=d[u]+p;
                Q.insert(make_pair(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++)
    {
        if(d[i]=inf)
            d[i]=0;
        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;
}