Cod sursa(job #1614545)

Utilizator SirStevensIonut Morosan SirStevens Data 25 februarie 2016 23:32:28
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <bits/stdc++.h>

using namespace std;

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

#define Nmax 50005
#define INF 1e5

int n,m,t,L[100005],x,y,c,L1[100005];

vector <pair <int, int> > G[Nmax];
vector <int> T;

int cmp(const int &a, const int &b){
    return(L1[a] > L1[b]);
}

void dijkstra(int s){


    int node;
    T.push_back(s);
    make_heap(T.begin(),T.end(),cmp);
    for(int i=1;i<=n;i++){
        L1[i]=INF;
        L1[s]=0;
        }
    while(!T.empty()){

        node=T.front();
        pop_heap(T.begin(),T.end(),cmp);
        T.pop_back();
        for(int i=0;i<G[node].size();i++)
            if(L1[G[node][i].first] > L1[node] + G[node][i].second){
                L1[G[node][i].first] = L1[node] + G[node][i].second;
                T.push_back(G[node][i].first);
                push_heap(T.begin(),T.end(),cmp);
        }

    }


}

int main(){
    in>>t;
    int s;
    while(t){

        in>>n>>m>>s;
        for(int i=1;i<=n;i++)
            in>>L[i];
        for(int i=1;i<=m;i++){
            in>>x>>y>>c;
            G[x].push_back({y,c});

        }
        dijkstra(s);
        int ok=1;
        for(int i=1;i<=n;i++)
            if(L1[i] != L[i]){
                ok=0;
                break;
        }

        if(ok == 1)
            out<<"DA"<<'\n';
        else
            out<<"NU"<<'\n';

        for(int i=1;i<=n;i++)
            L[i]=INF;
        for(int i=1;i<=n;i++)
            G[i].clear();


       t--;

    }

    return 0;
}