Cod sursa(job #1466645)

Utilizator crysstyanIacob Paul Cristian crysstyan Data 29 iulie 2015 18:52:51
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 50001
#define inf 2000000000

using namespace std;

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

int nrquiz, n, m, s, d1[NMAX], d[NMAX], a, b, c, i;

struct distante
{
    int node, dist;
};
vector < distante > v[NMAX];

struct compare
{
    bool operator () (distante &a, distante &b)
    {
        return a.dist > b.dist;
    }
};

priority_queue < distante, vector < distante >, compare > pq;

void initialize()
{
    for (i = 1; i <= n; ++ i)
        d[i] = inf;
    d[s] = 0;
}

void solve()
{
    f >> n >> m >> s;

    for (i = 1; i <= n; ++ i)
        f >> d1[i];

    for (i = 1; i <= m; ++i)
    {
        f >> a >> b >> c;
        distante y;
        y.node = b;
        y.dist = c;
        v[a].push_back(y);
        y.node = a;
        v[b].push_back(y);
    }

    initialize();

    distante x;
    x.node = s;
    x.dist = 0;
    pq.push(x);

    while (!pq.empty())
    {
        int minim = pq.top().node;
        pq.pop();

        for (vector < distante > :: iterator it = v[minim].begin(); it != v[minim].end(); ++ it)
            if (d[it -> node] > d[minim] + it -> dist)
        {
            d[it -> node] = d[minim] + it -> dist;
            pq.push(*it);
        }
    }

    bool ok = 1;

    for (i = 1; i <= n; ++ i)
        if (d[i] != d1[i])
    {
        ok = 0;
        break;
    }

    if (ok) g << "DA\n";
    else
        g << "NU\n";
}

int main()
{
    f >> nrquiz;

    while (nrquiz)
    {
        nrquiz --;
        solve();
    }
    return 0;
}