Cod sursa(job #2397350)

Utilizator moltComan Calin molt Data 4 aprilie 2019 12:27:03
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <bits/stdc++.h>
using namespace std;

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

const int N = 50000;
const int M = 100000;
const int INF = 2000000000;

int T, n, m, ns, a, b, c;
int dd[N + 5], d[N + 5];
bool viz[N + 5];

struct xyc
{
    int vecin, cost;
};
vector<xyc> v[N + 5];

struct compare
{
    bool operator() (int x, int y)
    {
        return d[x] > d[y];
    }
};

priority_queue<int, vector<int>, compare> q;

void BFS(int ns)
{
    q.push(ns);
    d[ns] = 0;
    while (!q.empty())
    {
        int nod = q.top();
        q.pop();
        viz[nod] = false;
        for (vector<xyc> :: iterator it = v[nod].begin(); it != v[nod].end(); ++it)
        {
            int vecin = it -> vecin;
            int cost = it -> cost;
            if (d[vecin] > d[nod] + cost)
            {
                d[vecin] = d[nod] + cost;
                if (viz[vecin] == false)
                {
                    viz[vecin] = true;
                    q.push(vecin);
                }
            }
        }
    }
}

int main()
{
    in>>T;
    while (T--)
    {
        for (int i = 1;i <= n;++i) v[i].clear();
        while (!q.empty()) q.pop();
        memset(viz, 0, sizeof viz);
        in>>n>>m>>ns;
        for (int i = 1; i <= n; ++i)
        {
            in>>dd[i];
            d[i] = INF;
        }
        for (int i = 1; i <= m; ++i)
        {
            in>>a>>b>>c;
            v[a].push_back({b, c});
        }
        BFS(ns);
        bool ok = true;
        for (int i = 1; i <= n; ++i)
            if (d[i] != dd[i]) {ok = false; break;}
        if (ok == true) out<<"DA\n";
        else out<<"NU\n";

    }
    return 0;
}