Cod sursa(job #2474887)

Utilizator AndreiD31Dragan Andrei AndreiD31 Data 15 octombrie 2019 22:17:33
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;

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

vector< pair<int,int> > v[50100];
priority_queue< pair <int,int> , vector < pair <int,int> > , greater < pair <int,int> > > h;

int d[50100],viz[50100];

void dijkstra(int nod)
{
    int nd,vecin,distanta;

    d[nod]=0;
    h.push(make_pair(0,nod));

    while(!h.empty())
    {
        nd=h.top().second;

        if(!viz[nd])
        {
            viz[nd]=1;

            while(!v[nd].empty())
            {
                vecin=v[nd].back().first;
                distanta=v[nd].back().second;

                v[nd].pop_back();

                if(d[vecin]>d[nd]+distanta)
                {
                    d[vecin]=d[nd]+distanta;
                    h.push(make_pair(d[vecin],vecin));
                }
            }
        }

        h.pop();
    }
}

int T,pas,ok,n,m,S,i,x,y,c,dist[50100];

int main()
{
    f>>T;
    for(pas=1;pas<=T;pas++)
    {
        f>>n>>m>>S;
        for(i=1;i<=n;i++)
        {
            f>>dist[i];
            viz[i]=0;
            d[i]=INT_MAX;
        }

        for(i=1;i<=m;i++)
        {
            f>>x>>y>>c;
            v[x].push_back(make_pair(y,c));
            v[y].push_back(make_pair(x,c));
        }

        dijkstra(S);
        ok=1;

        for(i=1;i<=n;i++)
        {
            if(d[i]!=dist[i]){ok=0;i=n+1;break;}
        }

        if(ok==1)g<<"DA"<<'\n';
        else g<<"NU"<<'\n';

    }
    return 0;
}