Cod sursa(job #1478041)

Utilizator metrix007Lungu Ioan Adrian metrix007 Data 27 august 2015 17:18:38
Problema Distante Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <algorithm>
#include <queue>
#include <utility>
#define NMAX 50005
#define INF 5000

using namespace std;

ifstream in("distante.in");
ofstream out("distante.out");

int n,m,t,xx,yy,s,cc,dc[NMAX],d[NMAX],val,y,nod;
bool inCoada[NMAX];
vector<int> a[NMAX],c[NMAX];
queue<int> coada;
void init()
{
    in >> n >> m >> s;
    for(int i=1;i<=n;i++)
    {
        d[i]=INF;
        a[i].clear();
        c[i].clear();
    }
}

void citire()
{
    for(int i=1;i<=n;i++)
        in >> dc[i];

    for(int i=0;i<m;i++)
    {
        in >> xx >> yy >> cc;
        a[xx].push_back(yy);
        a[yy].push_back(xx);
        c[xx].push_back(cc);
        c[yy].push_back(cc);
    }
    d[s]=0;
}

void bellmanFord()
{
    coada.push(s);
    while(!coada.empty())
    {
        nod = coada.front();
        coada.pop();
        inCoada[nod] = false;
        for(int i=0;i<a[nod].size();i++)
        {
            if(d[a[nod][i]] > d[nod] + c[nod][i])
            {
                d[a[nod][i]] = d[nod] + c[nod][i];
                if(!inCoada[a[nod][i]])
                {
                    coada.push(a[nod][i]);
                    inCoada[a[nod][i]] = true;

                }
            }
        }
    }
}
void afisare()
{
    for(int i=1;i<=n;i++)
        if(d[i]!=dc[i])
    {
        out << "NU\n";
        return;
    }
    out << "DA\n";
}

int main()
{
    in >> t;
    for(int i=0;i<t;i++)
    {
        init();
        citire();
        bellmanFord();
        afisare();

    }
    return 0;
}