Cod sursa(job #1339595)

Utilizator Emilia26Hangan Emilia Emilia26 Data 10 februarie 2015 23:50:28
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define INF 0x3f3f3f3f
#define MAX 50001
using namespace std;

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

int T, n, m, S, d[MAX], a[MAX];
bool ok[MAX];
vector<vector<pair<int, int>>> G;
queue<int> Q;

void Read();
void Solve( int s );
//void Reset();

int main()
{
    Read();

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

void Read()
{
    is >> T;
    while( T-- )
    {
        is >> n >> m >> S;
        G.resize(n+1);
        for ( int i = 1; i <= n; ++i )
            is >> a[i];
        while ( m-- )
        {
            int x, y, c;
            is >> x >> y >> c;
            G[x].push_back({y, c});
            G[y].push_back({x, c});
        }
        Solve(S);
        bool OK = false;
        for ( int i = 1; i <= n; ++i )
            if ( a[i] != d[i] )
                OK = true;
        if ( OK )
            os << "NU\n";
        else
            os << "DA\n";
        G.clear();
    }
}

void Solve(int s)
{
    Q.push(s);
    memset(d, 63, sizeof(d) );
    d[s] = 0;
    int nod;
    while ( !Q.empty() )
    {
        nod = Q.front();
        Q.pop();
        ok[nod] = false;
        vector<pair<int, int>>::iterator it;
        for ( it = G[nod].begin(); it != G[nod].end(); ++it )
        {
            if ( d[it->first] > d[nod] + it->second && !ok[it->first] )
            {
                d[it->first] = d[nod] + it->second;
                Q.push(it->first);
                ok[it->first] = true;
            }
        }
    }

}