Cod sursa(job #1338588)

Utilizator tatianazTatiana Zapirtan tatianaz Data 10 februarie 2015 09:40:22
Problema Distante Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
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, ok[SIZE];

vector <pair <int, int> > v[SIZE];
queue <int> Q;

void Read()
{
    is >> n >> m >> s;
    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;

    memset(ok, 0, sizeof(ok));

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

            }
        }
    }
}

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;
}