Cod sursa(job #1338546)

Utilizator tatianazTatiana Zapirtan tatianaz Data 10 februarie 2015 09:06:10
Problema Distante Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

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

const int SIZE = 50001;

#define INF 0x3f3f3f3f

int t, n, m, s;
int ddat[SIZE], d[SIZE];
int x, y, z;
int nod, cost;
bool oke;

vector <vector <pair <int, int> > > v;
queue <int> Q;

void Read()
{
    is >> n >> m >> s;
    v.resize(m+1);
    for ( int i = 1; i <= n; ++i )
    {
        is >> ddat[i];
        v[i].clear();
    }

    for ( int i = 1; i <= m; ++i )
    {
        is >> x >> y >> z;
        v[x].push_back(make_pair(y, z));
        v[y].push_back(make_pair(x, z));
    }
}

void Dijkstra()
{
    for ( int i = 1; i <= n; ++i )
        d[i] = INF;

    Q.push(s);
    d[s] = 0;
    while ( !Q.empty() )
    {
        x = Q.front();
        Q.pop();
        for ( const auto& y : v[x] )
        {
            nod = y.first;
            cost = y.second;
            if ( d[nod] > d[x] + cost )
            {
                d[nod] = d[x] + cost;
                Q.push(nod);
            }
        }
    }
}

bool Check()
{
    oke = true;
    for ( int i = 1; i <= n; ++i )
        if ( ddat[i] != d[i] )
            return false;
    return true;
}

int main()
{
    is >> t;
    for ( int i = 1; i <= t; ++i )
    {
        Read();
        Dijkstra();
        if ( Check() )
            os << "DA\n";
        else
            os << "NU\n";
    }


    is.close();
    os.close();
    return 0;
}