Cod sursa(job #1045259)

Utilizator BogdySSSzekely Bogdan BogdySS Data 1 decembrie 2013 10:51:31
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <climits>
#include <vector>
#include <set>

using namespace std;
#define INF INT_MAX
ifstream fin ("distante.in");
ofstream fout ("distante.out");

struct pereche{
    int vf, ct;
};

vector<pereche> V[50005];
set< pair<int,int> > T;

int main()
{
    int t, n, m, s, Dinit[50005], D[50005];
    int a; pereche b;
    fin >> t;
    while(t--){
        fin >> n >> m >> s;
        for(int i=1;i<=n;i++)
            fin >> Dinit[i];
        while(m--){
            fin >> a >> b.vf >> b.ct;
            V[a].push_back(b);
        }
        for(int i=1;i<=n;i++)
            D[i]=INF;

        D[s]=0;
        T.insert(make_pair(0,s));
        int dist, nod;
        while(T.size()>0){
            dist=(*T.begin()).first;
            nod=(*T.begin()).second;
            T.erase(*T.begin());
            for(int i=0;i<V[nod].size();i++)
                if(D[V[nod][i].vf] > dist + V[nod][i].ct){
                    D[V[nod][i].vf] = dist + V[nod][i].ct;
                    T.insert(make_pair(D[V[nod][i].vf] , V[nod][i].vf));
                }
        }

        bool ok=true;
        for(int i=1;i<=n;i++){
            if(D[i]==INF)
                D[i]=0;
            if(D[i]!=Dinit[i])
                ok=false;
        }
        /*for(int i=1;i<=n;i++)
            cout << D[i] << " " << Dinit[i] << "   ";
        cout << "\n";*/
        if(ok)
            fout << "DA\n";
        else
            fout << "NU\n";


    }
    return 0;
}