Cod sursa(job #2323635)

Utilizator XDDDDariusPetean Darius XDDDDarius Data 19 ianuarie 2019 14:25:54
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <string.h>
#define INF 0x3f3f3f3f
std::ifstream in("distante.in");
std::ofstream out("distante.out");

using namespace std;
priority_queue < pair<int , int> > pq;
vector < pair <int , int > > v[50005];
int costurile_initiale[50005];
int costurile_reale[50005];

int n,m,start,t;

void dijkstra(int start)
{
    memset(costurile_reale,INF,sizeof(costurile_reale));
    pq.push({start,costurile_initiale[start]});
    costurile_reale[start]=0;
    while(!pq.empty())
    {
        int nod_curent = pq.top().first;
        int cost_curent = pq.top().second;
        pq.pop();
        if(costurile_reale[nod_curent]!=INF)
        {
            for(int i=0;i<v[nod_curent].size();i++)
            {
                int nod_vecin = v[nod_curent][i].first;
                int cost_vecin = v[nod_curent][i].second;
                if(costurile_reale[nod_curent] + cost_vecin < costurile_reale[nod_vecin])
                {
                    costurile_reale[nod_vecin]=costurile_reale[nod_curent] + cost_vecin;
                    pq.push({nod_vecin,costurile_reale[nod_vecin]});
                }
            }
        }
    }
}

int main()
{
    int x,y,cost;
    in>>t;
    for(int teste=1;teste<=t;teste++)
    {
        in>>n>>m>>start;
        for(int i=1;i<=n;i++)
        {
            in>>costurile_initiale[i];
        }
        for(int i=1;i<=m;i++)
        {
            in>>x>>y>>cost;
            v[x].push_back({y,cost});
        }
        dijkstra(start);
        bool ebun=1;
        for(int i=1;i<=n;i++)
        {
            if(costurile_initiale[i]!=costurile_reale[i])
            {
                ebun=0;
            }
        }
        if(ebun)
        {
            out<<"DA\n";
        }
        else out<<"NU\n";
    }
    return 0;
}