Cod sursa(job #977305)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 25 iulie 2013 16:02:49
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>

#define In "distante.in"
#define Out "distante.out"

#define _node first
#define cost second
#define PII pair<int,int>
#define Inf 0x3f3f3f3f
#define Nmax 50002

using namespace std;

struct cmp
{
    bool operator ()(const PII A,const PII B) const
    {
        return A.cost > B. cost;
    }
};

ifstream in(In);
ofstream out(Out);
vector< PII >Graph[Nmax];
int D[Nmax], Dist[Nmax],N, Source;

inline void Read()
{
    int X, Y, C, i, M;
    in>>N>>M>>Source;

    for(i = 1; i <= N; ++i)
        in>>D[i];

    for(; M ; --M)
    {
        in>>X>>Y>>C;
        Graph[X].push_back(make_pair(Y,C));
        Graph[Y].push_back(make_pair(X,C));
    }
}

inline void Solve()
{
    priority_queue< PII ,vector < PII > ,cmp > Q;
    Q.push(make_pair(Source,0));
    memset(Dist,Inf,sizeof(Dist));
    Dist[Source] = 0;
    PII curent;
    vector< PII > :: iterator it;
    while(!Q.empty())
    {
        curent = Q.top();
        Q.pop();
        if(Dist[curent._node]<curent.cost)
            continue;
        for(it = Graph[curent._node].begin();it!=Graph[curent._node].end();++it)
        {
            if(Dist[(*it)._node]>curent.cost+(*it).cost)
            {
                Dist[(*it)._node] = curent.cost+(*it).cost;
                Q.push(make_pair((*it)._node,Dist[(*it)._node]));
            }
        }
    }
}

inline void Write()
{
    int i,ok = 1;
    for(i=1;i<=N;++i)
    {
        if(D[i]!=Dist[i])
            ok = 0;
        Graph[i].clear();
    }
    if(!ok)
        out<<"NU\n";
    else
        out<<"DA\n";
}

int main()
{
    int T;
    for(in>>T; T ; --T)
    {
        Read();
        Solve();
        Write();
    }
    in.close();
    out.close();
    return 0;
}