Cod sursa(job #2650914)

Utilizator popoviciAna16Popovici Ana popoviciAna16 Data 20 septembrie 2020 20:02:38
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

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

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

struct el
{
    int c, nod;
    bool operator <(const el &alt) const
    {
        return c > alt.c;
    }
};

priority_queue <el> p;
int d[50001];
bool b[50001];

int ver[50001];

int main()
{
    int t, q;
    int n, m, s, i, j, x, y, z;
    fin >> t;
    for (q = 1; q<=t; q++)
    {
        fin >> n >> m >> s;
        
        for (i = 1; i<=n; i++)
        {
            v[i].clear();
            d[i] = 1<<30;
            b[i] = 0;
        }
        while (p.empty() == 0)
            p.pop();
        
        for (i = 1; i<=n; i++)
            fin >> ver[i];
        for (i = 1; i<=m; i++)
        {
            fin >> x >> y >> z;
            v[x].push_back({y, z});
            v[y].push_back({x, z});
        }
        
        d[s] = 0;
        p.push({0, s});
        
        for (i = 1; i<n; i++)
        {
            while (p.empty() == 0 && b[p.top().nod])
                p.pop();
            if (p.empty() == 1)
                break;
            
            x = p.top().nod;
            p.pop();
            b[x] = 1;
            
            for (j = 0; j<v[x].size(); j++)
                if (d[v[x][j].first] > d[x] + v[x][j].second)
                {
                    d[v[x][j].first] = d[x] + v[x][j].second;
                    p.push({d[v[x][j].first], v[x][j].first});
                }
        }
        
        for (i = 1; i<=n && ver[i] == d[i]; i++);
        if (i <= n)
            fout << "NU\n";
        else
            fout << "DA\n";
    }
    return 0;
}