Cod sursa(job #2590882)

Utilizator mihaicosmin2011Mihai Cosmin mihaicosmin2011 Data 29 martie 2020 11:03:37
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <bits/stdc++.h>
#define NMAX 50005
#define oo (1 << 30)
using namespace std;

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

int d[NMAX], dist[NMAX], x, y, n, m, i, vecin, cost, k, c, t, q;
bool viz[NMAX], ok;

vector <pair <int, int> > v[NMAX];

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

priority_queue <int, vector <int>, elem> Q;

int main()
{
    f >> t;
    while(t --)
    {
        f >> n >> m >> q;
        for(i = 1; i <= n; ++ i)
        {
            f >> d[i];
            dist[i] = oo;
            viz[i] = 0;
        }

        for(i = 1; i <= m; ++ i)
        {
            f >> x >> y >> c;
            v[x].push_back(make_pair(y, c));
            v[y].push_back(make_pair(x, c));
        }

        dist[q] = 0;
        viz[q] = 1;
        Q.push(q);

        while(!Q.empty())
        {
            k = Q.top();
            Q.pop();
            viz[k] = 0;
            for(i = 0; i < v[k].size(); ++ i)
            {
                vecin = v[k][i].first;
                cost = v[k][i].second;
                if(dist[vecin] > dist[k] + cost)
                {
                    dist[vecin] = dist[k] + cost;
                    if(viz[vecin] == 0)
                    {
                        viz[vecin] = 1;
                        Q.push(vecin);
                    }
                }
            }
        }

        for(i = 2, ok = 0; i <= n; ++ i)
        {
            if(dist[i] == oo)
                dist[i] = 0;
            if(dist[i] != d[i])
            {
                ok = 1;
                break;
            }
        }
        if(ok == 1) g << "NU\n";
        else g << "DA\n";
        memset(v, 0, sizeof(v));
        memset(d, 0, sizeof(d));
    }
    return 0;
}