Cod sursa(job #1594686)

Utilizator andrew_assassin789Andrei Manea andrew_assassin789 Data 9 februarie 2016 18:03:14
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
#define w 50001
#define pp pair<int,int>
#define c first
#define x second
using namespace std;
priority_queue <pp> q;
vector <pp> a[w];
bool viz[w];
int cnt[w];
int d[w];
int main()
{
    ifstream f("bellmanford.in");
    ofstream g("bellmanford.out");
    int t,i,n,m,x,y,cost,negc=0;
    pp r;
    f>>n>>m;
    for (i=1;i<=m;i++)
    {
        f>>x>>y>>cost;
        a[x].push_back(make_pair(cost,y));
    }
    for (i=2;i<=n;i++)
        d[i]=INT_MAX;
    q.push(make_pair(0,1));viz[1]=1;cnt[1]++;
    while ( (!q.empty()) && (!negc) )
    {
        t=q.top().x;
        q.pop();viz[t]=0;
        for (i=0;i<a[t].size();i++)
        {
            r=a[t][i];
            if (d[r.x]>d[t]+r.c)
            {
                d[r.x]=d[t]+r.c;
                if (!viz[r.x])
                {
                    if (cnt[r.x]>n) negc=1;
                    else
                    {
                        q.push(make_pair(-d[r.x],r.x));
                        viz[r.x]=1;
                        cnt[r.x]++;
                    }
                }
            }
        }
    }
    if (negc)
        g<<"Ciclu negativ!\n";
    else
    {
        for (i=2;i<=n;i++)
        {
            g<<d[i]<<' ';
        }
        g<<'\n';
    }
    f.close();
    g.close();
    return 0;
}