Cod sursa(job #2161242)

Utilizator calinlixandruLixandru Calin-Mihai calinlixandru Data 11 martie 2018 16:19:33
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <cstring>

#define maxx 50002
#define cost first
#define nod second
#define inf 0x3f3f3f3f

using namespace std;

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

int n,m,j,c,i,viz[maxx],rez[maxx],T,s,corect,x;
vector < pair <int,int> > G[maxx];
vector < pair <int,int> > :: iterator it;
priority_queue < pair < int, int >, vector < pair < int, int > >, greater < pair < int, int > > > pq;
pair <int, int> aux;

int main()
{
    f>>T;
    for(int k=0;k<T;k++)
    {
        f>>n>>m>>s;

        for(i=1;i<=n;i++)
        {
            f>>rez[i];
        }
        for(int r=1;r<=m;r++)
        {
            f>>i>>j>>c;
            G[i].push_back(make_pair(c,j));
            G[j].push_back(make_pair(c,i));
        }
        pq.push({0,s});
        while(!pq.empty())
        {
            aux=pq.top();
            pq.pop();
            if(!viz[aux.nod])
            {
                viz[aux.nod]=aux.cost;
                for(it=G[aux.nod].begin();it!=G[aux.nod].end();it++)
                {
                    if(!viz[(*it).nod])
                        pq.push({aux.cost+(*it).cost,(*it).nod});
                }
            }
        }
        corect=1;
        for(i=1;i<=n;i++)
        {
            if(i==s)
            {
                viz[i]=0;
            }
            if(viz[i]!=rez[i])
                corect=0;
        }
        if(corect==1)
            g<<"DA"<<'\n';
        else
            g<<"NU"<<'\n';

    }
    g<<1;
    f.close();
    g.close();
    return 0;
}