Cod sursa(job #1126722)

Utilizator Coman95coman cosmin Coman95 Data 27 februarie 2014 09:26:15
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;

#define NMAX 50001
#define INF 0x3f3f3f3f
typedef vector<pair<int, int> >::iterator IT;

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

int teste, n, m, s;
set<pair<int, int> > T;
vector<pair<int, int> > G[NMAX];
int d[NMAX];
int ds[NMAX];

void Solve( int nod );

int main()
{
    int x, y, c;
    fin >> teste;
    while(teste)
    {
        fin >> n >> m >> s;
        for( int i = 1; i <= n; ++i )
            G[i].clear();
        for( int i = 1; i <= n; ++i )
            fin >> ds[i];
        for( int i = 1; i <= n; ++i )
        {
            fin >> x >> y >> c;
            G[x].push_back(make_pair(c,y));
        }
        Solve( s );
        --teste;
    }
    fin.close();
    fout.close();
    return 0;
}

void Solve( int nod )
{
    int x, dist;
    for( int i = 1; i <= n; ++i )
        d[i] = INF;
    d[nod] = 0;
    T.insert(make_pair(0, nod));
    while( !T.empty() )
    {
        dist = T.begin()->first;
        x = T.begin()->second;
        T.erase(T.begin());
        for( IT it = G[x].begin(); it != G[x].end(); ++it )
        {
            if( d[it->second] > dist + it->first)
            {
                d[it->second] = dist + it -> first;
                T.insert(make_pair(d[it->second], it->second));
            }
        }
    }
    bool ok = true;
    for( int i = 1; i <= n; ++i )
        if( d[i] != ds[i] )
            ok = false;
    if( ok == true )
        fout << "DA\n";
    else
        fout << "NU\n";
}