Cod sursa(job #1415750)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 6 aprilie 2015 00:59:06
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <fstream>
#include <cstring>
#include <vector>
#include <set>
#define DIM 50005

using namespace std;

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

int N,M,S;
int T;
int n;
vector <pair <int,int> > v[DIM];
int D[DIM],dist[DIM];
set <pair <int,int > > H;
int solve(){
    memset(D,0x3f3f3f3f,sizeof(D));
    fin>>N>>M>>S;
    for(int i=1;i<=N;i++)
        fin>>dist[i];
    while(M--){
        int x,y,cost;
        fin>>x>>y>>cost;
        v[x].push_back(make_pair(y,cost));
        v[y].push_back(make_pair(x,cost));
    }
    D[S]=0;
    H.insert(make_pair(0,S));
    while(!H.empty()){
        int val=(*H.begin()).first;
        int node=(*H.begin()).second;
        H.erase(*H.begin());
        for(std::vector <pair <int,int> >::iterator it=v[node].begin();it!=v[node].end();it++)
            if(D[it->first]>val+it->second){
                D[it->first]=val+it->second;
                H.insert(make_pair(D[it->first],it->first));
            }
    }
    int ok=1;
    for(int i=1;i<=N;i++){
        v[i].clear();
        if(dist[i]!=D[i])
            ok=0;
    }
    return ok;
}
int main(){
    fin>>T;
    while(T--){
        if(solve())
            fout<<"DA\n";
        else
            fout<<"NU\n";
    }
    fin.close();fout.close();
    return 0;
}