Cod sursa(job #1363648)

Utilizator johnyJohny Deep johny Data 27 februarie 2015 09:30:19
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <vector>
#include <queue>
#define MX 250001
#define NX 50001

using namespace std;

ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");
int n,m;
int d[MX];
int nrap[NX];
bool viz[MX];
bool ciclu_negativ=false;

struct muchie
{
    int j,c;
};

struct cmp
{
    bool operator() (int& a, int& b)
    {
        return d[a] > d[b];
    }
};
vector<muchie> v[MX];
priority_queue<int, vector<int>, cmp> q;

void citire()
{
    int i,x;
    muchie e;
    fin>>n>>m;
    for(i=1; i<=m; i++)
    {
        fin>>x>>e.j>>e.c;
        v[x].push_back(e);
    }
}

void bellmanford()
{
    vector<muchie>::iterator it;
    int u;
    q.push(1);
    viz[1]=true;

    while(!q.empty()&&!ciclu_negativ)
    {
        u = q.top();
        q.pop();
        viz[u]=false;

        for(it=v[u].begin(); it!=v[u].end(); it++)
        {
            if(d[u] + it->c < d[it->j] && d[u]!=(1<<30))
            {
              d[it->j] = d[u] + it->c;
              if(!viz[it->j])
               {
                if(nrap[it->j] > n)
                  ciclu_negativ=true;
                else
                {viz[it->j]=true;
                 q.push(it->j);
                 nrap[it->j]++;
                }
               }
            }
        }
    }
}

int main()
{
    int i;
    citire();
    for(i=2; i<=n; i++) d[i] = (1<<30);

    bellmanford();
    if(ciclu_negativ)
        fout<<"Ciclu negativ!\n";
    else
    for(i=2; i<=n; i++)
    {
        fout<<((d[i]==(1<<30)) ? 0 : d[i])<<' ';
    }

    //for(i=1; i<=n; i++) v[i].clear();

    fin.close(); fout.close();
    return 0;
}