Cod sursa(job #2112700)

Utilizator anisca22Ana Baltaretu anisca22 Data 23 ianuarie 2018 19:34:09
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <bits/stdc++.h>
#define NMAX 50005
#define INF 0x3f3f3f3f

using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");

struct str{
    int nod, cost;

    bool operator < (const str &other) const{
        return cost > other.cost;
    }
};

int T, N, M, source;
int d[NMAX], viz[NMAX];
vector <str> v[NMAX];
priority_queue <str> q;

void reset()
{
    for (int i = 1; i <= N; i++)
    {
        v[i].clear();
        viz[i] = INF;
    }
}

int verif()
{
    for (int i = 1; i <= N; i++)
        if (viz[i] != d[i])
            return 0;
    return 1;
}

int main()
{
    fin >> T;
    while (T--)
    {
        fin >> N >> M >> source;
        reset();
        viz[source] = 0;
        for (int i = 1; i <= N; i++)
            fin >> d[i];
        for (int i = 1; i <= M; i++)
        {
            int x, y, c;
            fin >> x >> y >> c;
            v[x].push_back({y, c});
            v[y].push_back({x, c});
        }
        q.push({source, 0});
        while (!q.empty())
        {

            int nod = q.top().nod;
            int cost = q.top().cost;
            q.pop();
            if (cost != viz[nod]) continue;
            vector <str> :: iterator it;
            for (it = v[nod].begin(); it != v[nod].end(); it++)
            {
                str nr = *it;
                int nxt = nr.nod;
                int cst = nr.cost;
                if (viz[nod] + cst < viz[nxt])
                {
                    viz[nxt] = viz[nod] + cst;
                    q.push({nxt, viz[nxt]});
                }
            }
        }
        if (verif())
            fout << "DA\n";
        else fout << "NU\n";
    }
    return 0;
}