Cod sursa(job #2299845)

Utilizator vladsirbu23Vlad Sirbu vladsirbu23 Data 10 decembrie 2018 11:42:33
Problema Distante Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define s second
#define f first
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
vector <pair<int,int> > v[100010];
priority_queue <pair <int,int>,vector<pair<int,int> >,greater< pair<int,int > > > q;
pair <int,int> p;
int N,M,S,viz[50010],ans[50010],T,d[50010],ok;
int main()
{
    int x1,x2,c,i,k;
    fin>>T;
    for(k=1; k<=T; k++)
    {
        fin>>N>>M>>S;
        for(i=1; i<=N; i++)
        {
            fin>>d[i];
        }
        for(i=1; i<=M; i++)
        {
            fin>>x1>>x2>>c;
            v[x1].push_back(make_pair(c,x2));
            v[x2].push_back(make_pair(c,x1));
        }
        for(auto it:v[S])
        {
            q.push(it);
        }
        viz[S]=1;
        while(q.empty()!=1)
        {
            p=q.top();
            q.pop();
            if(viz[p.s]==0)
            {
                ans[p.s]=p.f;
                for(auto it:v[p.s])
                {
                    q.push(make_pair(p.f+it.f,it.s));
                }
                viz[p.s]=1;
            }
        }
        ok=1;
        for(i=1; i<=N; i++)
        {
            if(ans[i]!=d[i])
                ok=0;
        }
        if(ok==1)
            fout<<"DA\n";
        else
            fout<<"NU\n";
        for(i=1;i<=N;i++)
        {
            v[i].clear();
        }
        for(i=1;i<=N;i++)
        {
            viz[i]=0;
            ans[i]=0;
        }
    }
}