Cod sursa(job #2653877)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 29 septembrie 2020 14:39:22
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda traininggraph Marime 1.48 kb
#include <fstream>
#include <vector>
#include <queue>
#define DIM 50001
#define INF 2000000000
using namespace std;

ifstream fin ("distante.in");
ofstream fout ("distante.out");
int t,n,m,i,a,b,c,x,y,s,vecin,ok,d[DIM],w[DIM];
priority_queue <pair<int,int>,vector< pair<int,int> >, greater < pair<int,int> > > H;
vector < pair<int,int> > v[DIM];
int main (){

    fin>>t;
    for (;t--;){
        fin>>n>>m>>s;
        for (i=1;i<=n;i++){
            fin>>w[i];
            v[i].clear();
            d[i] = INF;
        }
        d[s] = 0;
        for (i=1;i<=m;i++){
            fin>>a>>b>>c;
            v[a].push_back (make_pair(b,c));
            v[b].push_back (make_pair(a,c));
        }
        H.push (make_pair(0,s));
        while (!H.empty()){
            x = H.top().second;
            y = H.top().first;
            H.pop();
            if (d[x] >= y){
                for (vector< pair<int,int> > :: iterator it = v[x].begin();it!=v[x].end();it++){
                    vecin = it -> first;
                    c = it -> second;
                    if (d[x] + c < d[vecin]){
                        d[vecin] = d[x] + c;
                        H.push (make_pair(d[vecin],vecin));
                    }}}}

        ok = 0;
        for (i=1;i<=n;i++)
            if (d[i] != w[i]){
                ok = 1;
                break;
            }
        if (ok == 0)
            fout<<"DA\n";
        else
            fout<<"NU\n";
    }

    return 0;
}