Cod sursa(job #2231492)

Utilizator Y0da1NUME JMECHER Y0da1 Data 14 august 2018 17:10:57
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

#define maxn 50005
using namespace std;
const int alot = 2e9;

int N, M, S;
int precalc[maxn];
int dist[maxn];
unsigned char vizitat[maxn];

class cmp{
public:
    bool operator () (pair <int, int> p1, pair <int, int> p2)
    {
    return p1.second > p2.second;
    }
};
vector <pair <int, int> > G[maxn];
priority_queue <pair <int, int>,
                vector<pair <int, int> >,
                cmp> Q;
int main()
{
    ifstream in ("distante.in");
    ofstream out ("distante.out");

    int t;
    in>>t;
    while(t--)
    {
        in>>N>>M>>S;
        int x, y, c;
        for(int i = 1; i <= N; ++i)
            in>>precalc[i];
        for(int i = 1; i <= N; ++i)
            {
                in>>x>>y>>c;
                G[x].push_back({y, c});
            }
        for(int i = 1; i <= N; ++i)
            dist[i] = alot;
        dist[S] = 0;

        Q.push(make_pair(S, dist[S]));
        while(!Q.empty())
        {
            int cur = Q.top().first;
            Q.pop();

            if(vizitat[cur])
                continue;
            vizitat[cur] = 1;
            for(int i = 0; i < G[cur].size(); ++i)
            {
                int succ = G[cur][i].first;
                if (dist[succ] > dist[cur] + G[cur][i].second)
                {
                    dist[succ] = dist[cur] + G[cur][i].second;
                    Q.push(make_pair(succ, dist[succ]));
                }
            }

        }
        for (int i = 1; i <= N; ++i)
            if(dist[i] != precalc[i])
                goto hell;
        out<<"DA\n";
        continue;

hell:
        out<<"NU\n";
    }
    return 0;
}