Cod sursa(job #2140644)

Utilizator SnokySlivilescu Vlad Snoky Data 23 februarie 2018 19:00:16
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

#define NMax 50005
#define oo (1 << 3)

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

int T, N, M, S;
int D1[NMax], D[NMax], InCoada[NMax];
vector < pair < int, int > > a[NMax];

struct comp
{
    bool operator()(int x, int y)
    {
        return D[x] > D[y];
    }
};
priority_queue <int, vector < int >, comp > q;
void Dijkstra(int start)
{
    for(int i = 1; i <= N; i++)
    {
        D[i] = oo;
        InCoada[i] = 0;
    }
    D[start] = 0;
    q.push(start);
    InCoada[start] = 1;
    while(!q.empty())
    {
        int curent = q.top();
        q.pop();
        InCoada[curent] = 0;
        for(unsigned int i = 0; i < a[curent].size(); i++)
        {
            int vecin = a[curent][i].first;
            int cost = a[curent][i].second;
            if(D[curent] + cost < D[vecin])
            {
                D[vecin] = D[curent] + cost;
                if(!InCoada[vecin])
                {
                    q.push(vecin);
                    InCoada[vecin] = 1;
                }
            }

        }
    }
}
void Print()
{
    int t = 1;
    for(int i = 1; i <= N; i++)
    {
        if(D[i] != D1[i])
        {
            t = 0;
            break;
        }
    }
    if(t == 1) fout << "DA" << "\n";
    else       fout << "NU" << "\n";
}
void Read()
{
    fin >> T;
    for(int i = 1; i <= T; i++)
    {
        fin >> N >> M >> S;
        for(int j = 1; j <= N; j++)
        {
            fin >> D1[j];
        }
        for(int j = 1; j <= M; j++)
        {
            int x, y, c;
            fin >> x >> y >> c;
            a[x].push_back(make_pair(y, c));
            a[y].push_back(make_pair(x, c));
        }
        Dijkstra(S);
        Print();
    }
}
int main()
{
    Read();
}