Cod sursa(job #2829518)

Utilizator petru.burdusaBurdusa Petru petru.burdusa Data 8 ianuarie 2022 18:12:49
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
using namespace std;
int t,n,m,s,i,j,q[50005],r[50005],a,b,c,x,y,contor,viz[50005],ok;
vector <int> v[50005],d[50005];
set< pair<int,int> > w;
int main()
{
    ifstream in("distante.in");
    ofstream out("distante.out");
    in>>t;
    for(j=1;j<=t;j++)
    {
        in>>n>>m>>s;
        for(i=1;i<=n;i++)
            viz[i]=0;
        for(i=1;i<=n;i++)
            in>>q[i];
        for(i=1;i<=m;i++)
        {
            in>>a>>b>>c;
            v[a].push_back(b);
            d[a].push_back(c);
            v[b].push_back(a);
            d[b].push_back(c);
        }
        for(i=1;i<=n;i++)
            r[i]=1<<30;
        r[s]=0;
        w.insert(make_pair(0,s));
        contor=1;
        while(contor>0)
        {
            x=w.begin()->first;
            y=w.begin()->second;
            if(viz[y]==1)
            {
                w.erase(w.begin());
                contor--;
            }
            else
            {
                for(i=0;i<v[y].size();i++)
                {
                    if(r[y]+d[y][i]<r[v[y][i]] && viz[v[y][i]]==0)
                    {
                        r[v[y][i]]=r[y]+d[y][i];
                        w.insert(make_pair(r[v[y][i]], v[y][i]));
                        contor++;
                    }
                }
                viz[y]=1;
            }
        }
        ok=0;
        for(i=1;i<=n;i++)
        {

            if(r[i]==1<<30)
                r[i]=0;
            if(r[i]!=q[i])
                ok=1;
        }

        if(ok==0)
            out<<"DA\n";
        else
            out<<"NU\n";
    }
}