Cod sursa(job #2460728)

Utilizator maria.campioanaMaria Ioana maria.campioana Data 24 septembrie 2019 10:45:00
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <bits/stdc++.h>
#define pii pair <int,int>
#define INF 0x3f3f3f3f

using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");

struct str{
    int nod,cost;
    bool operator <(const str&other) const
    {
        return cost>other.cost;
    }
};

int n,m,s,t,drum1[50005],drum2[50005];
vector <pii> v[50005];
priority_queue <str> pq;

void dijkstra()
{
    while(!pq.empty())
    {
        int nod=pq.top().nod;
        int cost=pq.top().cost;
        pq.pop();
        if(cost!=drum2[nod])
            continue;
        for(auto it=v[nod].begin();it<v[nod].end();it++)
        {
            int nxt=(*it).first;
            int cst=(*it).second;
            if(drum2[nxt]>drum2[nod]+cst)
            {
                drum2[nxt]=drum2[nod]+cst;
                pq.push({nxt,drum2[nxt]});
            }
        }
    }
}



int main()
{
    fin>>t;
    while(t>0)
    {
        fin>>n>>m>>s;
        for(int i=1;i<=n;i++)
        {
            fin>>drum1[i];
        }
        for(int i=1;i<=m;i++)
        {
            v[i].clear();
            int x,y,z;
            fin>>x>>y>>z;
            v[x].push_back({y,z});
        }
        memset(drum2,INF,sizeof(drum2));
        drum2[s]=0;
        pq.push({s,0});
        dijkstra();
        int ok=1;
        for(int i=1;i<=n;i++)
        {
            if(drum1[i]!=drum2[i])
                ok=0;
        }
        if(ok)
            fout<<"DA"<<'\n';
        else
            fout<<"NU"<<'\n';
        t--;
    }
    return 0;
}