Cod sursa(job #2443958)

Utilizator Ionut28Porumb Palincas Ionut Ionut28 Data 29 iulie 2019 21:05:09
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int nmax = 50005;
const int oo = (1 << 30);
bool viz[nmax];
int n, m, g, s, d1[nmax], d[nmax];
vector < pair < int, int > > v[nmax];
struct compara
{
    bool operator() (int x, int y)
    {
        return d[x] > d[y];
    }
};
priority_queue < int, vector < int >, compara > C;
void dijkstra(int nodstart)
{
    for(int i = 1; i <= n; ++i)
    {
        d[i] = oo;
        viz[i] = false;
    }
    d[nodstart] = 0;
    viz[nodstart] = true;
    C.push(nodstart);
    while(!C.empty())
    {
        int nodcurent = C.top();
        C.pop();
        viz[nodcurent] = false;
        for(unsigned int i = 0; i < v[nodcurent].size(); ++i)
        {
            int vecin = v[nodcurent][i].first;
            int cost = v[nodcurent][i].second;
            if(d[vecin] > d[nodcurent] + cost)
            {
                d[vecin] = d[nodcurent] + cost;
                if(viz[vecin] == false)
                {
                    C.push(vecin);
                    viz[vecin] = true;
                }
            }
        }
    }

}
int main()
{
    fin >> g;
    for(int t = 1; t <= g; ++t)
    {
        fin >> n >> m >> s;
        for(int i = 1; i <= n; ++i)
            fin >> d1[i];
        for(int i = 1; i <= m; ++i)
        {
            int x, y, c;
            fin >> x >> y >> c;
            v[x].push_back(make_pair(y, c));
            v[y].push_back(make_pair(x, c));
        }
        dijkstra(s);
        bool ok = true;
        for(int i = 1; i <= n; ++i)
        {
            if(d1[i] != d[i])
            {
                ok = false;
                break;
            }
        }
        if(ok)
            fout << "DA" << "\n";
        else
            fout << "NU" << "\n";
    }
    return 0;
}