Cod sursa(job #2654614)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 1 octombrie 2020 18:48:23
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda traininggraph Marime 1.36 kb
#include <fstream>
#include <vector>
#include <set>
#define x first
#define y second
#define inf 2000000
using namespace std;

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

int t,n,m,i,j,d[50001],q[50001],src,x,y,cost,nod,vec;
vector <pair <int,int> > l[50001];
set <pair<int,int> > s;

int main(){
    for(fin>>t; t; t--){
        s.clear();

        fin>>n>>m>>src;
        for(i=1;i<=n;i++){
            fin>>q[i];
            d[i]=inf;

            while(!l[i].empty())
                l[i].pop_back();
        }
        d[src]=0;

        for(i=1;i<=m;i++){
            fin>>x>>y>>cost;
            l[x].push_back({y,cost});
            l[y].push_back({x,cost});
        }

        s.insert(make_pair(0,src));

        while(!s.empty()){
            nod=s.begin()->y;
            s.erase(s.begin());

            for(i=0;i<l[nod].size();i++){
                vec=l[nod][i].x;
                cost=l[nod][i].y;

                if(d[vec]>d[nod]+cost){
                    s.erase({d[vec],vec});
                    d[vec]=d[nod]+cost;
                    s.insert({d[vec],vec});
                }
            }
        }

        for(i=1;i<=n;i++)
            if(q[i]!=d[i])
                break;

        if(i<=n)
            fout<<"NU\n";
        else
            fout<<"DA\n";
    }

    return 0;
}