Cod sursa(job #2476616)

Utilizator Savu_Stefan_CatalinSavu Stefan Catalin Savu_Stefan_Catalin Data 19 octombrie 2019 10:24:58
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <fstream>
#include <vector>
#include <queue>
#define inf 0x3f3f3f3f
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
int i,l,k,sel[50100],d[50100],t,x,y,z,j,m,n,s,oar[50100],ok;
vector <pair <int,int > > g[50100];
priority_queue <pair<int,int>,vector <pair<int,int > >,greater <pair<int , int> > > Q;
void djk(int p)
{
    for (auto i: g[p]) {
        Q.push(i);
        d[i.second]=i.first;
    }
    sel[p]=true;
    while (!Q.empty())
    {
        while (!Q.empty()&&sel[Q.top().second])
            Q.pop();
        if (!Q.empty())
        {
            k=Q.top().second;
            sel[k]=true;
            Q.pop();
            for (auto i: g[k])
                if (d[i.second]>d[k]+i.first)
            {
                d[i.second]=d[k]+i.first;
                Q.push({d[i.second],i.second});
            }
        }
    }
}

int main()
{
    in>>t;
    for (j=1;j<=t;++j)
    {
        in>>n>>m>>s;
        for (i=1;i<=n;++i)
        {
            in>>oar[i];
        }
        for (i=1;i<=m;++i)
        {
            in>>x>>y>>z;
            g[x].push_back({z,y});
            g[y].push_back({z,x});
        }
        for (i=2;i<=n;++i)
            d[i]=INT_MAX;
            d[1]=0;
        djk(s);
        ok=0;
        for (i=1;i<=n;++i)
        {
            if (d[i]!=oar[i]) ok=1;
        }
        if (ok==0) out<<"DA";
        else out<<"NU";
      if (t!=j)  out<<'\n';
        for (i=1;i<=n;++i)
        {
            sel[i]=0;
            while(g[i].size())
            g[i].pop_back();

        }
        while (!Q.empty()) Q.pop();
    }
    return 0;
}