Cod sursa(job #2348147)

Utilizator roberthostiucHostiuc Robert Gabriel roberthostiuc Data 19 februarie 2019 13:47:05
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <bits/stdc++.h>
#define MAXN 100005
#define inf  (int)(1e9)
#define int_pair pair <int, int>

 using namespace std;

ifstream In("distante.in");
ofstream Out("distante.out");

int N, M,v[MAXN];
vector <int_pair> ADC[MAXN];

inline void AddEdge(int x, int y, int w) {
    ADC[x].push_back({y, w});
}

#define Vecin Edge.first

int Dist[MAXN];
priority_queue <int_pair, vector <int_pair>, greater <int_pair>> PQ;

void Dijkstra(int a) {
    for (int i=1; i<=N; ++i)
        Dist[i] = inf;
    Dist[a] = 0;
    PQ.push({0, a});

    int_pair Top;
    while (!PQ.empty()) {
        Top = PQ.top();
        PQ.pop();

        if (Top.first != Dist[Top.second]) continue;
        for (auto Edge:ADC[Top.second])
            if (Dist[Vecin] > Dist[Top.second] + Edge.second)
                Dist[Vecin] = Dist[Top.second] + Edge.second,
                PQ.push({Dist[Vecin], Vecin});
    }
}



void Rezolvare(int start,int n) {
    Dijkstra(start);
    int ok=0;
    for (int i=1;i<=n;i++)
        if(Dist[i]!=v[i])i=n,ok=1;
    if(ok==1)Out<<"NU\n";
        else Out<<"DA\n";
}

int main()
{
    int k,start;
    In>>k;
    for(int i=1;i<=k;i++){
    In >> N >> M>>start;
    for(int i=1;i<=N;i++)
        In>>v[i];
    for (int i=0, x, y, w; i<M; ++i)
        In >> x >> y >> w, AddEdge(x, y, w);
    Rezolvare(start,N);
    }
    return 0;
}