Cod sursa(job #1245546)

Utilizator japjappedulapPotra Vlad japjappedulap Data 19 octombrie 2014 14:03:51
Problema Distante Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>
#include <queue>
#include <cstring>
#include <bitset>
#include <vector>
using namespace std;

#define NDIM 50001
#define MDIM 100001
#define INF 1<<28

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

int N, M, T, OG[NDIM], S, D[NDIM];
vector < pair <int,int> > v[NDIM];

bitset <NDIM> checked;

struct COMP{
    bool operator ()(int a, int b)
    {   return D[a] > D[b];   }
};

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

void Solve();

int main()
{
    for (is >> T; T; --T) Solve();
    is.close();
    os.close();
};

void Solve()
{
    is >> N >> M >> S;
    for (int i = 1; i <= N; ++i)
        D[i] = INF;
    checked.reset();

    for (int i = 1; i <= N; ++i)
        is >> OG[i];
    for (int i = 1, a, b, c; i <= M; ++i)
        is >> a >> b >> c, v[a].push_back({b, c}), v[b].push_back({a, c});

    D[S] = 0;
    Q.push(S);

    for (int i, nod, cost; !Q.empty(); )
    {
        i = Q.top(); Q.pop();
        checked[i] = 1;
        for (int j = 0; j < v[i].size(); ++j)
        {
            nod = v[i][j].first;
            cost = v[i][j].second;
            if ( !checked[nod] && D[nod] > D[i] + cost)
            {
                D[nod] = D[i] + cost;
                Q.push(nod);
            }
        }
        for (; !Q.empty() && checked[Q.top()]; Q.pop());
    }
    for (int i = 1; i <= N; ++i)
    {
        if (D[i] != OG[i])
        {
            os << "NU\n";
            break;
        }
        if (i == N && D[i] == OG[i])
            os << "DA\n";
    }
    for (int i = 1; i <= N; ++i)
        v[i].clear();
};